2011-11-11 7 views
2

私はマルチスレッドでは最高ではありませんが、これは少し複雑です。うまくいけばそれをうまく説明できます。C#BackgroundWorker内の非同期作業ですか?

基本的に私はBackgroundWorkerタスクを持っています。その中には、Webサイトから情報を取得するための呼び出しがいくつかあります。これを行うより良い方法があるかもしれませんが、私はそれを考えることができません。私がこれをやっている理由は、すべてののウェブサイトへの呼び出し(およびその後の情報の処理)が完了したときに、1つのイベントを開催したいからです。

private void loadContent() { 
    BackgroundWorker worker = new BackgroundWorker(); 
    worker.DoWork += delegate(object sender, DoWorkEventArgs e) { 
     getAndProcessInformation(desiredInformationName); 
     getAndProcessInformation(someOtherDesiredInformationName); 
    }; 
    worker.RunWorkerCompleted += delegate(object sender, RunWorkerCompletedEventArgs e) { 
     MessageBox.Show("Finished!"); 
     Dispatcher.BeginInvoke(() => { progressBar(false); }); 
    }; 
    worker.RunWorkerAsync(); 
} 
private void getAndProcessInformation(string theInformationIWant){ 
    Fetcher dataFetcher = new Fetcher(); //Fetcher is a custom class that reads information from a web server 
    dataFetch.receivedData += delegate(DataResponseArgs args) { 
     //Process some data 
    }; 
    dataFetch.requestData(theInformationIWant); 
} 

だから、何が起こることは、データが実際に完了する前をRunWorkerCompletedメソッドが呼ばれる2つのgetAndProcessInformation直後に呼び出されて、ということです。

この

は、私が起こっているものは基本的です処理。何か方法はありますか?RunWorkerCompletedは、メソッドの処理が実際に終了した時点で実行されますか?

ここで、実際には処理が既に別のスレッドで行われているため、BackgroundWorkerは実際には必要ではないことがわかりましたが、1つのスレッドが必要な結果を得ることはできませんすべての処理が完了したときにトリガーされるイベント。だから、これは本当に2つの質問ですね。もし私がBackgroundWorkerを使用し続けるべきかどうか、どうすれば修正するのですか?もしそうでなければ何ができますか?

答えて

1

あなたのFetcherがすでに独自のスレッドを作成している場合、BackgroundWorkerを使用しても、あなたがすでに把握しているような意味合いはありません。

あなたはFetcherの実装を共有していないため、あなたは既に機能getAndProcessInformationが処理されるまで文句を言わないの復帰が行われた。この方法で

private void getAndProcessInformation(string theInformationIWant){ 
    Fetcher dataFetcher = new Fetcher(); 
    var eventHandle = new ManualResetEvent(false); 
    dataFetch.receivedData += delegate(DataResponseArgs args) { 
     //Process some data 
     eventHandle.Set(); 
    }; 
    dataFetch.requestData(theInformationIWant); 
    eventHandle.WaitOne(); 
} 

持っているものに固執したい場合は、おそらくこのようなものでなければなりません。一度に1つのフェッチしか動作しません。

すべてのフェッチャを並行して動作させたい場合は、WaitOneを削除し、getAndProcessInformationに待機ハンドルを返します。次にDoWorkで、すべてのハンドルが通知されるのを待つことができます。

+0

恐縮です。 –

関連する問題