Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在所有线程完成时覆盖游标_C#_Wpf_Multithreading_Asynchronous_Backgroundworker - Fatal编程技术网

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

C# 如何在所有线程完成时覆盖游标,c#,wpf,multithreading,asynchronous,backgroundworker,C#,Wpf,Multithreading,Asynchronous,Backgroundworker,初始信息: 我有一个方法,可以从数据库中获取数据,并将其拆分为逻辑部分(为了简单起见,让我们假设这个数字总是8个不相等的部分)。对于每个部分,我启动一个新的后台线程,将数据写入数据库 在此过程中,我将运行8个异步线程,所有线程都使用相同的_DoWork()和_RunWorkerCompleted()方法 当一个线程启动时,它将立即添加一个后台工作人员列表。在_RunWorkerCompleted()方法中,我从列表中删除该后台工作人员,并检查后台工作人员列表的计数是否为0;如果不是,我继续,如果

初始信息:

我有一个方法,可以从数据库中获取数据,并将其拆分为逻辑部分(为了简单起见,让我们假设这个数字总是8个不相等的部分)。对于每个部分,我启动一个新的后台线程,将数据写入数据库

在此过程中,我将运行8个异步线程,所有线程都使用相同的_DoWork()和_RunWorkerCompleted()方法

当一个线程启动时,它将立即添加一个后台工作人员列表。在_RunWorkerCompleted()方法中,我从列表中删除该后台工作人员,并检查后台工作人员列表的计数是否为0;如果不是,我继续,如果是,那么我必须让用户知道操作已经完成

问题是:

在任何线程开始之前,我调用Mouse.OverrideCursor=Cursors.Wait;以显示等待的光标。当一切完成后,我必须调用Mouse.OverrideCursor=null;以强制鼠标光标返回其正常状态

但是,当我在if语句内的_RunWorkerCompleted()方法中调用此函数,询问bw列表的计数是否为0时,我得到一个运行时异常,表明另一个线程拥有该对象

如何调用Mouse.OverrideCursor=null;在所有线程完成且没有运行时异常之后

注:

在试图从_RunWorkerCompleted()方法内部显示MessageBox时,我也遇到了同样的问题。我以为_RunWorkerCompleted()在UI线程上

任何帮助都将不胜感激

另外,如果需要任何代码来更好地评估问题,请询问并具体说明您希望看到代码的哪一部分(这些方法背后有很多问题,我不想发布太多代码而混淆任何人)

问候,


Kyle

当调用RunWorkerCompleted方法时,如果需要更新UI,则必须像这样使用Dispatcher,以便在UI线程中更新它:

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

如果您能展示一个最小的代码示例,而不是描述您的代码,这将非常有帮助。你不需要发布幕后发生的真实代码,但是花在编写一个简短但完整的示例上的时间是值得的。非常好!谢谢你的帮助。实际上,我以前曾尝试将代码放入调度程序中,但失败了。这是因为我使用的是Dispatcher.CurrentDispatcher.BeginInvoke()而不是这个.Dispatcher.Invoked()。再次感谢您的帮助!!