C# 如何在所有线程完成时覆盖游标
初始信息: 我有一个方法,可以从数据库中获取数据,并将其拆分为逻辑部分(为了简单起见,让我们假设这个数字总是8个不相等的部分)。对于每个部分,我启动一个新的后台线程,将数据写入数据库 在此过程中,我将运行8个异步线程,所有线程都使用相同的_DoWork()和_RunWorkerCompleted()方法 当一个线程启动时,它将立即添加一个后台工作人员列表。在_RunWorkerCompleted()方法中,我从列表中删除该后台工作人员,并检查后台工作人员列表的计数是否为0;如果不是,我继续,如果是,那么我必须让用户知道操作已经完成 问题是: 在任何线程开始之前,我调用Mouse.OverrideCursor=Cursors.Wait;以显示等待的光标。当一切完成后,我必须调用Mouse.OverrideCursor=null;以强制鼠标光标返回其正常状态 但是,当我在if语句内的_RunWorkerCompleted()方法中调用此函数,询问bw列表的计数是否为0时,我得到一个运行时异常,表明另一个线程拥有该对象 如何调用Mouse.OverrideCursor=null;在所有线程完成且没有运行时异常之后 注: 在试图从_RunWorkerCompleted()方法内部显示MessageBox时,我也遇到了同样的问题。我以为_RunWorkerCompleted()在UI线程上 任何帮助都将不胜感激 另外,如果需要任何代码来更好地评估问题,请询问并具体说明您希望看到代码的哪一部分(这些方法背后有很多问题,我不想发布太多代码而混淆任何人) 问候,C# 如何在所有线程完成时覆盖游标,c#,wpf,multithreading,asynchronous,backgroundworker,C#,Wpf,Multithreading,Asynchronous,Backgroundworker,初始信息: 我有一个方法,可以从数据库中获取数据,并将其拆分为逻辑部分(为了简单起见,让我们假设这个数字总是8个不相等的部分)。对于每个部分,我启动一个新的后台线程,将数据写入数据库 在此过程中,我将运行8个异步线程,所有线程都使用相同的_DoWork()和_RunWorkerCompleted()方法 当一个线程启动时,它将立即添加一个后台工作人员列表。在_RunWorkerCompleted()方法中,我从列表中删除该后台工作人员,并检查后台工作人员列表的计数是否为0;如果不是,我继续,如果
Kyle当调用RunWorkerCompleted方法时,如果需要更新UI,则必须像这样使用Dispatcher,以便在UI线程中更新它:
this.Dispatcher.Invoke(() =>
{
// YOUR UI UPDATE
});
如果您能展示一个最小的代码示例,而不是描述您的代码,这将非常有帮助。你不需要发布幕后发生的真实代码,但是花在编写一个简短但完整的示例上的时间是值得的。非常好!谢谢你的帮助。实际上,我以前曾尝试将代码放入调度程序中,但失败了。这是因为我使用的是Dispatcher.CurrentDispatcher.BeginInvoke()而不是这个.Dispatcher.Invoked()。再次感谢您的帮助!!