2017-10-10 5 views
5

好ましいです。 タスクAの完了時に結果にデータがある場合、タスクAの結果を返す必要があります。それ以外の場合は、タスクBの結果を返します。C#の非同期/待つ一方に複数のタスクは、私は次のシナリオ/要件を有する

私はパラレル化のパフォーマンスを最適化しようとしています。私がやっていることよりも良い方法があるかどうかは分かりません。これは私が望むことをするためのコードのように思えます。

var firstSuccessfulTask = await Task.WhenAny(taskA, taskB); 
if (firstSuccessfulTask != taskA) 
{ 
    await taskA; 
} 

if (taskA.Result != null) 
{ 
    return taskA.Result; 
} 

return await taskB; 
+3

まず、 'await taskA'を最初に呼び出し、' Task.WhenAny'呼び出しをスキップするのはなぜですか? – EJoshuaS

答えて

12

あなたの要件のとおりにコードを書いてください。 nullの場合を除き、Aの結果を返します。この場合、Bの結果を返します。

return await taskA ?? await taskB; 
+3

taskAが完了するまでtaskBの実行を開始しないでください。 –

+2

@PaulGelardi 'taskB'が、実際にあなたがその式を呼び出すときにタスクを開始するプロパティであれば、yesになります。既に開始されたタスクを持つローカル/フィールドの場合は、いいえ。命名規則と 'taskA'を繰り返し使用していることを考えれば、あなたがそれを使うたびに新しいタスクを作成しているわけではありません。それらは両方とも変数であり、新しいタスクを計算する式ではありません。それらが実際に新しいタスクを計算する式である場合は、まずそれをローカル変数に格納してからこれを行う必要があります。 – Servy

+0

それは理にかなっています。私は、非同期メソッドを呼び出した直後にタスクBが実行を開始したことを認識していませんでした。何かが待っているまで、起動していないと思っていました。それは、 です。 –

関連する問題