多くのアプリケーションと同様に、アプリケーションが長時間の計算を行っているときにステータス テキストを更新したいと考えています。Dispatcher と BackgroundWorker に関する記事を読みました。UIスレッドで更新が行われることを確認する必要があることはわかっています。私の最初の試みは:
MyView.UpdateStatus( "Please wait" );
LongComputation();
MyView.UpdateStatus( "Ready" );
(私が思うに) LongComputation がステータスの更新を妨げているため、これは機能しません。
だから私はこれをやろうとしました:
BackgroundWorker worker = new BackgroundWorker();
MyView.UpdateStatus( "Please wait");
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
LongComputation();
}
worker.RunWorkerAsync();
MyView.UpdateStatus( "Ready" );
余分なスレッドが UpdateStatus にステータス テキストを更新する機会を与えることを願っていました。どちらも機能しません。その理由の 1 つは、LongComputation の結果が Windows フォームに表示されることです。LongComputation を BackgroundWorker 内に配置するとすぐに、結果が表示されません。
そこで、フロー コードを使用して 3 回目の試行を行いました。
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
Dispatcher.Invoke(((Action)(() => Status.Text = args.Argument as string)));
};
worker.RunWorkerAsync(newStatus);
更新を別のスレッドに入れるとうまくいくことを望んでいました。しかし、そうではありませんでした。
ステータスが正しいプログラムの状態を反映していることを確認するにはどうすればよいですか?