c# – BackgroundWorker返回错误的线程
发布时间:2020-12-16 01:48:55 所属栏目:百科 来源:网络整理
导读:在我的应用程序中,我使用以下代码创建了一个新的UI-Thread: Thread thread = new Thread(() = { MyWindow windowInAnotherThread = new MyWindow(); windowInAnotherThread.Show(); System.Windows.Threading.Dispatcher.Run(); }) { IsBackground = true }
在我的应用程序中,我使用以下代码创建了一个新的UI-Thread:
Thread thread = new Thread(() => { MyWindow windowInAnotherThread = new MyWindow(); windowInAnotherThread.Show(); System.Windows.Threading.Dispatcher.Run(); }) { IsBackground = true }; thread.SetApartmentState(ApartmentState.STA); thread.Start(); 这给了我一个问题: 在MyWindow类的构造函数中,执行BackgroundWorker.在RunWorkerCompleted中,应该使用BackgroundWorker正在计算的某些数据更新Control. 我已经构建了一个小样本,它说明了这一点: public partial class MyWindow : Window { public MyWindow() { InitializeComponent(); var bw = new BackgroundWorker(); bw.DoWork += bw_DoWork; bw.RunWorkerCompleted += bw_RunWorkerCompleted; bw.RunWorkerAsync(); } void bw_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e) { this.Title = "Calculated title"; } void bw_DoWork(object sender,DoWorkEventArgs e) { Thread.Sleep(3000); } } 在bw_RunWorkerCompleted()中,我得到一个InvalidOperationException(调用线程无法访问此对象,因为另一个线程拥有它.).看起来,BackgroundWorker没有返回到从中启动它的正确的UI-Thread. 有人可以帮助我,我能做些什么来解决这个问题?我无法更改正在执行BackgroundWorker的代码,因为它位于我使用的框架中.但我可以在RunWorkerCompleted-Event中做其他事情.但我不知道,如何解决这个问题. 解决方法
问题是窗口过早创建.该线程还没有同步上下文.您可以通过在BGW构造函数调用上设置断点来查看这是调试器,并查看Thread.CurrentThread.ExecutionContext.SynchronizationContext.它是空的.这是BGW用来决定如何编组RunWorkerCompleted事件的方法.其中没有同步上下文,事件在线程池线程上运行并调用愤怒.
您需要尽快初始化调度程序.不是100%这是正确的方法,但似乎确实有效: Thread thread = new Thread(() => { System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => { MyWindow windowInAnotherThread = new MyWindow(); windowInAnotherThread.Show(); })); System.Windows.Threading.Dispatcher.Run(); }) { IsBackground = true }; thread.SetApartmentState(ApartmentState.STA); thread.Start(); 您还必须明确强制线程关闭.将此方法添加到MyWindow: protected override void OnClosed(EventArgs e) { Dispatcher.BeginInvokeShutdown(System.Windows.Threading.DispatcherPriority.Background); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容