在我的应用程序中,我使用以下代码创建了一个新的UI-Thread:
这给我带来了以下的问题:
在MyWindow类的构造函数中,一个BackgroundWorker被执行。在RunWorkerCompleted中应该使用一些数据更新一个控件,这些数据是BackgroundWorker正在计算的。
我建立了一个小示例,用于说明此问题:
在
请问有谁能帮我解决这个问题吗?我无法更改执行 BackgroundWorker 的代码,因为它是一个我使用的框架中的代码。但是我可以在 RunWorkerCompleted 事件中进行其他操作。但我不知道如何解决这个问题。
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正在计算的。
我建立了一个小示例,用于说明此问题:
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 事件中进行其他操作。但我不知道如何解决这个问题。