2012-01-28 10 views
1

2つのプロセスをスレッディングし、その結果得られたデータを結果の呼び出しから結合するには、どのような方法が最適でしょうか?私は現在、2つのWebサービスに接続しています。 1つのスレッドでDataAというWebサービスAを呼び出したいと思います。次に、別のスレッドでDataBのWebサービスBを呼び出します。私はその後、DataAとDataBから特定の情報を取得してDataCを作成する必要があります。私はまた、いつでもプロセス全体をキャンセルできる必要があります。2つのWebサービス呼び出しをスレッド化し、その結果のデータをC#で結合する最良の方法は何ですか?

私はThreadPoolを使用してみましたが、ThreadPoolスレッドをキャンセルする方法はありません。

UPDATE:現在、C#.NET 4.0

+0

を並列タスクを使用するのでしょうか? –

答えて

1

を使用してWaitHandleクラスにSystem.Threading名前空間の外観を与えます。 WaitAllは、いくつかのスレッドが完了するまでブロックする機能を提供します。

+0

WaitHandleクラスは、BackgroundWorkersなどの.Netスレッディングオプションで使用できますか?私は既に、ThreadPoolと一緒にWaitHandleクラスを使用してサンプルを見てきました。それは、ThreadPoolスレッドを中止できないという点を除いて、私の目的を十分に満たしています。 – arc1880

5

私はライブラリ(TPL、http://msdn.microsoft.com/en-us/library/dd537609.aspx).NETのバージョン

List<Data> GetData(CancellationToken cancel) 
{ 
List<Data> dataA; 
List<Data> dataB; 
Task[] tasks = new Task[] 
{ 
    Task.Factory.StartNew(() => DataA()), 
    Task.Factory.StartNew(() => DataNB()), 
}; 

Task.WaitAll(tasks, cancel); // Block until all tasks complete or cancelled. 
if (cancellation.IsCancellationRequested) 
    return new List<Data>(); 
return dataA.Concat(dataB); 
} 
+0

WebサービスコールにCancellationTokenを使用することはできますか? – arc1880

+0

Task.WaitAll()はCancellationTokenも受け取ります。 CancellationTokenがTask.WaitAll()に渡され、WaitAllがキャンセルされた場合はどうなりますか?起動されたスレッドはどうなりますか? – arc1880

+0

スレッドは、Webサービスの応答またはタイムアウトを受信するまで実行を続けます。 WaitAllがキャンセルされた場合、タスクは終了します。だから、Task.WaitAllの後に 'if(cancellation.IsCancellationRequested)がnullを返す;' –

関連する問題