答えて

0

あなたのモデルによっては、ワーカースレッドが作業を終了したときにワーカースレッドを作成者(または他のプロセス)にコールバックさせたい場合や、頻繁にワーカースレッドをポーリングして、完了した場合は、結果を取得します。

ワーカースレッドが結果を返すのを待つという考えは、マルチスレッドのメリットを損なうものです。

1

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

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

+1

のためにそうしながら、UI_を待っているとアップ_lockingの違いがあります。 –

+0

@TSar:「BackgroundWorker」のような古いコンポーネントを扱うコンテキストでは、「待機中」のセマンティクスは比較的複雑である(または少なくともそれが「待機中」であることを実証するために)。そのようなものは、 'async'や' await'の構文で表現するほうがずっと簡単で、開発者は 'BackgroundWorker'の大部分のユースケースを一掃することができます。 –

+0

次に、OPにBackgroundWorkerを使わないように指示するのではなく、選択肢を使って答えを補完するといいでしょう。今読んでいるところでは、マルチスレッドを一切使用しないことを提案しているようです。それは、プロセスが終了するまでアプリケーションをロックすることになります。 –

1

あなたのスレッドは、引数としてオブジェクトとイベントを発生させるかもしれない:

ThreadFinishedEvent(this, new ThreadEventArgs(object)); 

:私はあなたがブロックしに待ちたくないと仮定してい

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

    public object Object 
    { 
     get; private set; 
    } 
} 
18

結果に対してRunWorkerAsync()を実行します(実行した場合、非同期を実行する理由はありません)。

バックグラウンドプロセスが完了したときに通知する場合は、RunWorkerCompletedイベントをフックします。いくつかの状態を戻したい場合は、DoWorkのイベント引数のResultメンバーに戻します。

編集:私は途中で掲示 -

私のコード例を終え例:(バックグラウンド作業が行われる場所である)BackgroundWorkerのためのあなたのDoWorkイベントハンドラで

 


    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... 
    } 

 
87

があります引数DoWorkEventArgs。このオブジェクトには、パブリックプロパティオブジェクトのResultがあります。あなたの労働者が(あなたのケースでは、List<FileInfo>)その結果を生成したら、それにe.Resultを設定してください。

BackgroundWorkerがタスクを完了したので、RunWorkerCompletedEventArgsオブジェクトを引数としてRunWorkerCompletedイベントがトリガーされます。 BackgroundWorkerの結果がRunWorkerCompletedEventArgs.Resultに含まれます。

例:プロセスの非同期を実行するときに一般的に言って

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()); 
} 
+0

Bahhhありがとう! – ganjeii

0

、ワーカースレッドはデリゲートを呼び出す必要がありますか(ChrisFのような)イベントを発生。

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

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

チェックアウトこの詳細

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

関連する問題