RunWorkerAsync()
を返すにはList<FileInfo>
を返す必要があります。バックグラウンドワーカーからオブジェクトを返すにはどうすればよいですか?BackgroundWorkerでオブジェクトを返す方法
答えて
あなたのモデルによっては、ワーカースレッドが作業を終了したときにワーカースレッドを作成者(または他のプロセス)にコールバックさせたい場合や、頻繁にワーカースレッドをポーリングして、完了した場合は、結果を取得します。
ワーカースレッドが結果を返すのを待つという考えは、マルチスレッドのメリットを損なうものです。
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;
}
}
結果に対して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...
}
があります引数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());
}
Bahhhありがとう! – ganjeii
、ワーカースレッドはデリゲートを呼び出す必要がありますか(ChrisFのような)イベントを発生。
値を返すことができる並行処理機能を持つ新しいPFXをチェックアウトすることができます。
たとえば、値を返すことができるオーバーロードを持つParallel.ForEach()という関数があります。
チェックアウトこの詳細
- 1. BackgroundWorkerからオブジェクトを返す
- 2. タイマーでbackgroundworkerを実行する方法
- 3. BackgroundWorkerでwpf GUIオブジェクトを編集
- 4. BackGroundWorkerに引数を渡す方法
- 5. jqueryでオブジェクト値を返す方法
- 6. laravelでオブジェクトを返す方法5.2
- 7. Googleのアプリケーションスクリプトでオブジェクトを返す方法
- 8. C#BackgroundWorker inside BackgroundWorker
- 9. C#でクラスのオブジェクトからクラスのオブジェクトを返す方法は?
- 10. ManyToManyField関連オブジェクトでオブジェクトを返す方法
- 11. BackgroundWorkerイベントの使用方法RunWorkerCompleted
- 12. オブジェクトの良い型を返す方法
- 13. null json_encodeオブジェクトを返す方法
- 14. オブジェクトへのポインタを返す方法は?
- 15. コンボボックスからオブジェクトを返す方法
- 16. backgroundWorker
- 17. QUnitでオブジェクトを返す関数をスタブする方法は?
- 18. elasticsearchでネストされたオブジェクトを返す方法を制限する方法
- 19. BackgroundWorkerが別のBackgroundWorker(C#)を実行するのを待つ方法を教えてください。
- 20. WindowsフォームのラベルテキストをBackgroundWorkerから設定する方法
- 21. BackgroundWorkerを正しく停止する方法
- 22. TextViewにBackgroundWorkerの結果を設定する方法
- 23. backgroundworkerからテキストボックスを自動的に呼び出す方法は?
- 24. Backgroundworkerの使い方は?
- 25. BackgroundWorkerの使い方は?
- 26. DistpatcherTimerを使用してBackgroundWorkerタスクを繰り返す
- 27. defステートメントを自己(...)内でオブジェクトを返す方法
- 28. GraphQLでユニオンクエリ結果を持つオブジェクト型を返す方法は?
- 29. jsonでポストコントローラコールを呼び出してModelViewオブジェクトを返す方法
- 30. 代入パラメータを使用してNSubstituteでオブジェクトを返す方法
のためにそうしながら、UI_を待っているとアップ_lockingの違いがあります。 –
@TSar:「BackgroundWorker」のような古いコンポーネントを扱うコンテキストでは、「待機中」のセマンティクスは比較的複雑である(または少なくともそれが「待機中」であることを実証するために)。そのようなものは、 'async'や' await'の構文で表現するほうがずっと簡単で、開発者は 'BackgroundWorker'の大部分のユースケースを一掃することができます。 –
次に、OPにBackgroundWorkerを使わないように指示するのではなく、選択肢を使って答えを補完するといいでしょう。今読んでいるところでは、マルチスレッドを一切使用しないことを提案しているようです。それは、プロセスが終了するまでアプリケーションをロックすることになります。 –