您的位置:程序门 -> .net技术 -> c#



关于跨越线程更新的问题,高手进来帮我解决一下,大谢!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于跨越线程更新的问题,高手进来帮我解决一下,大谢!
发表于:2007-01-10 11:50:18 楼主
一个窗体,里边有很多控件,比如有一个为mycontrol的控件和progressbar,提供了一个addentity方法,就是类似在这个控件中增加一个item.还有一个button,当用户点击这个button的时候,会create出一个线程:
thread   thread   =   new   thread(new   threadstart(dowork()));
...
dowork()中会调用另外一个class   a中的某个方法,如a.parseentity(),同时也打开进度条窗口;
...
a.parseentity()
{
...
ongetentityresult(this,myeventargs());
}
ongetentityresult是一个event,myeventargs继承eventargs.
接受端在另外一个class   b中进行。
在处理函数中执行:
b::EXECute()
{
    methodinvoker   mi   =   new   methodinvoker(update);
    this.form.begininvoke(mi,new   object[]{ "abc "});
}

void   update(string   name)
{
      this.form.mycontrol.addentity(name);
      this.fomr.progressbar.updateui();
}
为什么每次执行的时候,启动线程,如果执行addentity则ui主线程几乎死锁了。但是如果屏蔽this.fomr.mycontrol.addentity,则progressbar能及时更新当前进度。

另外,我想问问:在子线程通过call   begininvoke,想去执行ui主线程中某个control中的方法时,真正执行这个方法的线程是ui主线程还是子线程?

谢谢大侠们!!!
发表于:2007-01-10 12:22:291楼 得分:0
ref:
http://blog.csdn.net/knight94/archive/2006/08/24/1111267.aspx
发表于:2007-01-10 13:23:342楼 得分:0
谢谢楼上的兄弟:)
之前我看过你的文章,所以我也用begininvoke来通知ui   thread更新的。但是在更新中调用到mycontrol.addentity,这个方法将会执行一些非ui的操作,占用一些时间。我如果在更新control同时,也调用addentity,则主线程界面的progressbar没有不断重绘,但是progressbar窗口可以移动。。
请问这种情况该如何解决?
谢谢
发表于:2007-01-10 13:38:253楼 得分:0
to   mycontrol.addentity,这个方法将会执行一些非ui的操作,占用一些时间。我如果在更新control同时,也调用addentity,则主线程界面的progressbar没有不断重绘,但是progressbar窗口可以移动。

你可以把mycontrol.addentity放到线程中去执行,因为不牵扯到ui操作;而真正的更新ui的时候,再去begininvoke或者invoke。
发表于:2007-01-10 17:42:284楼 得分:0
谢谢knight94兄弟:)
不过我还有一个问题:如果当子线程利用begininvoke来通知ui   thread更新后,假设用户点击progressbar上的cancel按钮,如果控制子线程结束线程,同时在子线程结束后做一些清理性的工作,然后关闭progress   bar   dialog??
发表于:2007-01-11 10:45:105楼 得分:0
to   如果当子线程利用begininvoke来通知ui   thread更新后,假设用户点击progressbar上的cancel按钮,如果控制子线程结束线程,同时在子线程结束后做一些清理性的工作,然后关闭progress   bar   dialog??

方法是一样的,在processbar上的cancel点击事件中,控制线程结束标志,从而线程可以通过此标志来决定是否要继续运行。


快速检索

最新资讯
热门点击