web-dev-qa-db-ja.com

BackgroundWorkerがオブジェクトを返すようにする方法

RunWorkerAsync()List<FileInfo>を返すようにする必要があります。バックグラウンドワーカーからオブジェクトを返すにはどうすればよいですか?

53
Clair Vengs

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());
}
91
David

ブロックして結果を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...
    }

20
JMarsch

RunWorkerAsync()はプロセスを非同期的に開始し、プロセスが実際に完了する前にコードを実行し続けます。 BackgroundWorkerの結果を取得する場合は、その値を保持するインスタンス変数を作成し、BackgroundWorkerが完了したら確認する必要があります。

作業が完了するまで待つ場合、BackgroundWorkerは必要ありません。

1
Adam Robinson

スレッドにオブジェクトを引数としてイベントを発生させることができます:

ThreadFinishedEvent(this, new ThreadEventArgs(object));

どこ:

public class ThreadEventArgs : EventArgs
{
    public ThreadEventArgs(object object)
    {
        Object = object
    }

    public object Object
    {
        get; private set;
    }
}
1
ChrisF

モデルに応じて、作業の終了時にワーカースレッドを作成者(または他のプロセス)にコールバックするか、ワーカースレッドを頻繁にポーリングして、完了したかどうかを確認する必要があります。したがって、結果を取得します。

ワーカースレッドがその結果を返すのを待つという考えは、マルチスレッドの利点を損ないます。

0
Welbog

一般的に、非同期プロセスを実行する場合、ワーカースレッドはデリゲートを呼び出すか、イベント(ChrisFなど)を起動する必要があります。

値を返すことができる並行処理機能を備えた新しいPFXをチェックアウトできます。

たとえば、値を返すことができるオーバーロードを持つParallel.ForEach()という関数があります。

詳細はこちらをご覧ください

http://msdn.Microsoft.com/en-us/magazine/cc817396.aspx

0
Sruly