2017-05-10 16 views
-1

C#の並行性に関する質問があります。最近、私が使用するユーティリティ関数を追加する必要が非同期タスクと1つのユーティリティー関数を並列に実行する

var aresult = A.Result; 
var bresult = B.Result; 
var cResult = C.Result; 

:私は3つのタスクA、B、Cがあると私は彼らのこのような結果を使用して、その後それらを並行して実行する

task.WhenAll(A,B,C)を待って使用していますcResultsと、このような値を返します。私は、タスクAとBは、タスクCよりもはるかに長い時間がかかることを、このknoweldegeを持っており、プロセスを最適化したいと(仕事を持っている

var sortedResult = SortResult(cResult); 

(この関数は非同期メソッドではありません) AとB)と(CとsortedResults(cResults))はパラレルで実行されます私はAとBがCとsortedResults(cResult)を処理するのにかかる時間が同じであるように使います。どうやってやるの?

ご迷惑をおかけして申し訳ありません。何卒よろしくお願いいたします。

答えて

1

await task.WhenAll(A,B,C)は並行してタスクを実行しません。実行すると3 はすでにタスクを実行し、すべて完了したときにメソッドが実行を継続することが保証されます。 A,B、およびC(おそらくいくつかの非同期メソッドを呼び出すことによって)を作成するだけで、がすでにに並行してタスクの実行を開始しています。

もしあなたが望むセマンティクスがA BとCを開始するならば、Cが終了したら何かをしてから、AとBが終了したら何かをして、それぞれの操作を書き出してください。 A、B、Cを起動するのは3つの非同期メソッドを呼び出すのと同じくらい簡単ですが、Cの終了後に何かをするのはCを待つほど簡単で、AとBが完了した後に何かするのはAとBを待つほど簡単です(またはTask.WhenAllとこれらの2つのタスクを提供すると、同じ効果が得られます)。

+0

タスクA、BはタスクCと並行して実行され、sortResult(cResult) –

+0

@pojrojです。これで私が記述したシーケンスがこれを達成します。 – Servy

関連する問題