を返し、私は休閑のコードで新しいUIスレッドを作成します。BackgroundWorkerのは、間違ったスレッドに自分のアプリケーションで
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が計算しているいくつかのデータでコントロールを更新する必要があります。
私はこの説明されて小さなサンプル、ビルドする必要があり:(。別のスレッドがそれを所有しているので、呼び出し元のスレッドこのオブジェクトにアクセスすることはできません)私はInvalidOperationException
が得るbw_RunWorkerCompleted()
で
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);
}
}
を。それは、BackgroundWorkerが開始された正しいUIスレッドに戻っていないようです。
私はこの問題を解決するために何ができるのですか? BackgroundWorkerを実行しているコードを変更することはできません。なぜなら、それは私が使用しているフレームワークにあるからです。しかし、私はRunWorkerCompleted-Eventで何か他のことをすることができます。しかし、私はこの問題を解決する方法を知らない。
なぜ新しいUIスレッドを作成するのですか?必要ではなく、生産性とこの問題の原因ではありません。 –