gpt4 book ai didi

c# - 对 Winform 控件的线程安全调用

转载 作者:行者123 更新时间:2023-12-03 20:50:37 26 4
gpt4 key购买 nike

引用文献: http://msdn.microsoft.com/en-us/library/ms171728.aspxhttp://stackoverflow.com/questions/5408155/how-to-make-delegate-thread-sta

我想创建一个新线程并将其设为 STA,因此我无法使用异步委托(delegate)或 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 将执行哪个线程? - 如果你说“主 UI 线程” - 那么在这种情况下,系统如何知道它是否应该在主 UI 线程中运行而不是在其他线程中运行?当我调用 invoke() 时,我没有传递任何引用(关于主 UI 线程).. 因此从技术上讲,invoke() 是在同一线程上执行的。

问题 2:我偶尔会收到 InvalidOperationException。正是这个 http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/6b450a21-e588-414a-afae-9adabfd03674/

如果UpdateUIControls在主UI线程中执行,应该不会出现问题,对吧?所以,我想我的问题的答案实际上取决于问题 1。

如果有人分享他/她的智慧,我将不胜感激

卡雷普尔

最佳答案

控件具有线程亲和性;您只能从他们的创建线程安全地与他们交谈。

您正在检查 InvokeRequired;但是,您将 Delegate.Invoke (在当前线程上运行)与 Control.Invoke (在 UI 线程上运行)混合在一起;意义截然不同。应该是:

oneOfMyControls.Invoke(del [, args]);

关于c# - 对 Winform 控件的线程安全调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5492453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com