所有线程完成时如何覆盖游标

时间:2014-01-28 21:30:49

标签: c# wpf multithreading asynchronous backgroundworker

初始信息:

我有一个方法从数据库中获取数据并将其分成逻辑部分(为简单起见,我们只说这个数字总是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,如果需要任何代码来更好地评估问题,请询问并具体说明您希望看到的代码部分(这些方法背后有很多内容,我不想通过发布太多代码来混淆任何人。)

此致

凯尔

1 个答案:

答案 0 :(得分:1)

当你需要更新UI时调用RunWorkerCompleted方法时,你必须像这样使用Dispatcher才能在UI线程中更新它:

 this.Dispatcher.Invoke(() =>
            {
               // YOUR UI UPDATE
            });