c# – BackgroundWorker返回错误的线程

c# – BackgroundWorker返回错误的线程,第1张

概述在我的应用程序中,我使用以下代码创建了一个新的UI-Thread: Thread thread = new Thread(() => { MyWindow windowInAnotherThread = new MyWindow(); windowInAnotherThread.Show(); System.Windows.Threading 在我的应用程序中,我使用以下代码创建了一个新的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);    }
总结

以上是内存溢出为你收集整理的c# – BackgroundWorker返回错误的线程全部内容,希望文章能够帮你解决c# – BackgroundWorker返回错误的线程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1217362.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存