RunWorkerAsync()
がList<FileInfo>
を返すようにする必要があります。バックグラウンドワーカーからオブジェクトを返すにはどうすればよいですか?
DoWork
(バックグラウンド処理が行われる場所)のBackgroundWorker
イベントハンドラーには、引数DoWorkEventArgs
があります。このオブジェクトには、パブリックプロパティオブジェクトResultがあります。ワーカーが結果を生成したら(あなたの場合、List<FileInfo>
)、 セットする e.Result
それに、そして戻ります。
BackgroundWorkerがタスクを完了すると、RunWorkerCompleted
オブジェクトを引数として持つRunWorkerCompletedEventArgs
イベントをトリガーします。 RunWorkerCompletedEventArgs.Result
にはBackgroundWorker
からの結果が含まれます。
例:
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
int result = 2+2;
e.Result = result;
}
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
int result = (int)e.Result;
MessageBox.Show("Result received: " + result.ToString());
}
ブロックして結果をRunWorkerAsync()で待機したくないと仮定しています(もしそうなら、非同期を実行する理由はないでしょう!
バックグラウンドプロセスが終了したときに通知を受ける場合は、RunWorkerCompletedイベントをフックします。何らかの状態を返したい場合は、DoWorkのイベント引数のResultメンバでそれを返します。
編集:私は時期尚早に投稿した-私のコード例を終了
例:
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// do your thing
....
// return results
e.Result = theResultObject;
}
// now get your results
private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MyResultObject result = (MyResultObject)e.Result;
// process your result...
}
RunWorkerAsync()
はプロセスを非同期的に開始し、プロセスが実際に完了する前にコードを実行し続けます。 BackgroundWorker
の結果を取得する場合は、その値を保持するインスタンス変数を作成し、BackgroundWorker
が完了したら確認する必要があります。
作業が完了するまで待つ場合、BackgroundWorker
は必要ありません。
スレッドにオブジェクトを引数としてイベントを発生させることができます:
ThreadFinishedEvent(this, new ThreadEventArgs(object));
どこ:
public class ThreadEventArgs : EventArgs
{
public ThreadEventArgs(object object)
{
Object = object
}
public object Object
{
get; private set;
}
}
モデルに応じて、作業の終了時にワーカースレッドを作成者(または他のプロセス)にコールバックするか、ワーカースレッドを頻繁にポーリングして、完了したかどうかを確認する必要があります。したがって、結果を取得します。
ワーカースレッドがその結果を返すのを待つという考えは、マルチスレッドの利点を損ないます。
一般的に、非同期プロセスを実行する場合、ワーカースレッドはデリゲートを呼び出すか、イベント(ChrisFなど)を起動する必要があります。
値を返すことができる並行処理機能を備えた新しいPFXをチェックアウトできます。
たとえば、値を返すことができるオーバーロードを持つParallel.ForEach()という関数があります。
詳細はこちらをご覧ください