在我的应用程序中,我使用以下代码创建了一个新的 UI 线程:
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 线程。
有人可以帮助我,我能做些什么来解决这个问题?我无法更改正在执行 BackgroundWorker 的代码,因为它位于我使用的框架中。但我可以在 RunWorkerCompleted-Event 中做其他事情。但我不知道如何解决这个问题。