RunWorkerAsync
1)呼び出すメソッドとして入れないでください。あなたが考えている方法を実際に実行しているわけではありません。あなたが本当にそこに置くべきものは、次のようなものです:
this.Invoke(new MethodInvoker(MethodToUpdateUI));
MethodToUpdateUI
このコンテキストで行う必要がある UI の更新を具体的に行う新しいメソッドを作成する必要があります。
2) は必要ありませんInvokeRequired
。バックグラウンド スレッドにいます。呼び出しは常に必要です。
正直なところ、全体のパターンはif(invoke required) call myself else do stuff
私が嫌いな奇妙な構造です。 InvokeRequired
めったに使用しないでください。ほとんどの場合、自分が UI スレッドにいるのかバックグラウンド スレッドにいるのかを把握しておく必要があります。非決定論的であってはなりません)。通常、これはUI スレッドで実行する必要があるメソッドを持つことを意味します。すでに UI スレッドにいる場合は、それらを呼び出すだけです。バックグラウンド スレッドにいて、それがわかっている場合は、Invoke
最初に呼び出します。
その上、すでに UI スレッドにいるときに呼び出しても問題なく動作するため、バックグラウンド スレッドにいるか、既に UI スレッドにいるかに関係なく、Invoke
単に呼び出しても重大な悪影響はありません。Invoke
3) 通常、ビジネス上の問題を解決するためのコードは UI コードから分離するのが最善です。DoWork のハンドラ内から呼び出しているのはコードの匂いです。これが終わり近くにある場合は、おそらく にイベント ハンドラを追加する必要がありますRunWorkerCompleted
。これを定期的に呼び出してワーカーの進行状況で UI を更新する場合は、イベントを使用ReportProgress
して処理する必要がありますProgressReported
。実行時間の長いタスクで使用する UI から情報を取得するには、バックグラウンド タスクを開始する前に情報にアクセスする必要があります。これらのいずれでもない例外的なケースについては、 を使用するInvoke
のが適切かもしれませんが、残りのケースはまれであるべきです。