初始信息:
我有一个方法从数据库中获取数据并将其分成逻辑部分(为简单起见,我们只说这个数字总是8个不相等的部分)。对于每个部分,我启动一个新的后台线程将数据写入数据库。
在执行此操作时,我将最终运行8个异步线程,所有这些线程都使用相同的_DoWork()和_RunWorkerCompleted()方法。
当线程启动时,会立即添加一个后台工作者列表。在_RunWorkerCompleted()方法中,我从列表中删除该后台工作程序,并检查后台工作程序列表的计数是否为0;如果不是我继续,如果是,那么我必须让用户知道操作已经完成。
问题:
在任何线程开始之前,我调用Mouse.OverrideCursor = Cursors.Wait;为了显示等待光标。当一切都完成后,我必须调用Mouse.OverrideCursor = null;为了强制鼠标光标回到正常状态。
但是,当我在if语句中的_RunWorkerCompleted()方法中调用它时,询问bw列表的计数是否为0,我得到一个运行时异常,说明另一个线程拥有该对象。
如何调用Mouse.OverrideCursor = null;所有线程完成后没有运行时异常?
注意:
尝试从_RunWorkerCompleted()方法内部显示MessageBox时,我也遇到了同样的问题。我以为_RunWorkerCompleted()在UI线程上?
非常感谢任何帮助。
PS,如果需要任何代码来更好地评估问题,请询问并具体说明您希望看到的代码部分(这些方法背后有很多内容,我不想通过发布太多代码来混淆任何人。)
此致
凯尔
答案 0 :(得分:1)
当你需要更新UI时调用RunWorkerCompleted方法时,你必须像这样使用Dispatcher才能在UI线程中更新它:
this.Dispatcher.Invoke(() =>
{
// YOUR UI UPDATE
});