[英]Thread Safe calls to Winform controls
参考: http : //msdn.microsoft.com/zh-cn/library/ms171728.aspx http://stackoverflow.com/questions/5408155/how-to-make-delegate-thread-sta
我想创建一个新线程并使其成为STA,因此无法使用异步委托或BackgroudWorker(如参考链接1所述),因此最终创建了自己的线程使其成为STA,并附加了一个回调以了解何时任务完成。 代码如下所示,即使我使用了必需的调用,我仍然会收到InvalidOperationException(有时)
delegate UpdateEventHander(Object sender, EventArgs e);
class MyTask{
// to generate an event
public event UpdateEventHandler Finished;
public void Start(){
Result = // something that require the thread to be STA.
Finished(this, EventArgs.Empty);
}
public Result GetResult(){
return Result;
}
}
Class Foo : Form{
// It has many UI Controls obviously
public void doSomething(){
MyTask task = new MyTask();
task.Finished += new UpdateEventHander(CompletionHandler);
Thread thread = new Thread(new ThreadStart(task.Start));
thread.setAppartmetnState(AppartmentState.STA);
thread.start();
}
public void CompletionHandler(Object sender, EventArgs e){
MyTask task = (MyTask) sender;
if (oneOfMyControls.InvokeRequired){
delegateToUpdateUIconrols del = new delegateToUpdateUIconrols(updateUIControls);
del.invoke();
}else{
UpdateUIControls();
}
}
public delegate void delegateToUpdateUIconrols();
public void UpdateUIControls(){
// It updates UI controls
// Datagrid view value properties like backgroud color and stuff.
// change text in the label.
}
}
问题1:UpdateUIControls将执行哪个线程? -如果您说“ Main UI Thread”(主UI线程)-那么在这种情况下,系统如何知道它是否应该在Main UI thead中运行而不是在其他线程中运行? 当我调用invoke()时,我没有传递任何引用(关于Main UI线程)。因此,技术上,invoke()是在同一线程上执行的。
问题2:有时,我会收到InvalidOperationException。 正是这个http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/6b450a21-e588-414a-afae-9adabfd03674/
如果UpdateUIControls在主UI线程中执行,则应该没有问题,对吗? 因此,我想我的问题的答案确实取决于问题1。
如果有人分享他/她的智慧,我将不胜感激
Karephul
控件具有线程关联性; 您只能从他们的创建线程中安全地与他们交谈。
您正在检查InvokeRequired; 但是,您正在将Delegate.Invoke(在当前线程上运行)与Control.Invoke(在UI线程上运行)混合在一起; 非常不同的意思。 它应该是:
oneOfMyControls.Invoke(del [, args]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.