私のアプリケーションでは、次のコードを使用して新しい 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 で別のことができます。しかし、この問題を解決する方法がわかりません。