2016-07-20 7 views
-2

Task.WhenAllを使用すると多くのメリットがありますが、少なくとも何かを書くのに必要なLOCは2倍になります。Task.WhenAllコード数が少ない

Listing1

var result1 = await SomeLongRunningOperation1().ConfigureAwait(false); 
var result2 = await SomeLongRunningOperation2().ConfigureAwait(false); 
var result3 = await SomeLongRunningOperation3().ConfigureAwait(false); 

Listing2

var result1Task = SomeLongRunningOperation1(); 
var result2Task = SomeLongRunningOperation2(); 
var result3Task = SomeLongRunningOperation3(); 

await Task.WhenAll(
    result1Task, 
    result2Task, 
    result3Task) 
    .ConfigureAwait(false); 

var result1 = result1Task.Result; 
var result2 = result2Task.Result; 
var result3 = result3Task.Result; 

Listing2 3回の操作でを待っている間当然Listing1は、3つの操作次々(3×10秒= 30秒)待ちます同じ時間(3秒間にわずか10秒)。

しかし、リスト2のコードは、読むのがずっと長くなります。

私の質問: リスト2のロジックを読みやすく、リスト1のようなもので書くことはできますか?

+0

は、配列内の「result1Task result2Task result3Task」を入れて、あなたのコードが短くなっています。 –

答えて

1

私がコメントで言ったように、これはあなたが探している並列処理を実現し、リスト2より少ないコード行を使用しています。

var result1Task = SomeLongRunningOperation1(); 
var result2Task = SomeLongRunningOperation2(); 
var result3Task = SomeLongRunningOperation3(); 

var result1 = await result1Task.ConfigureAwait(false); 
var result2 = await result2Task.ConfigureAwait(false); 
var result3 = await result3Task.ConfigureAwait(false); 

それはタイミングのわずかな違いを持っ​​ている - result1が大幅に利用可能な場合result2またはresult3が利用可能になる前に、より早期に割り当てられます。しかし、あなたはawaitの3つのタスクすべて(そして結果は何もしません)から、WhenAllで求めていたものと同じ3つのタスクがすべて完了するまで、実際にresult3の割り当てを過ぎて進まないでしょう。

0

Tupleを使用できますが、さまざまなアリティのためのヘルパーメソッドを構築する必要があります。タプル項目が命名されますので、あなたは組み込みのタプルのサポートを使用することができますC#7で

var results = await WhenAll(Operation1(), Operation2(), Operation3()); 
var result1 = results.Item1; 

public static async Task<Tuple<T1, T2, T3>> WhenAll<T1, T2, T3>(Task<T1> t1, Task<T2> t2, Task<T3> t3) 
{ 
    await Task.WhenAll(t1, t2, t3).ConfigureAwait(false); 
    var result1 = await t1.ConfigureAwait(false); 
    var result2 = await t2.ConfigureAwait(false); 
    var result3 = await t3.ConfigureAwait(false); 
    return Tuple.Create(result1, result2, result3); 
} 

使用法:ここでは3つの引数のための、1つです。

0

あなたの操作のすべてはあなたにも行うことができ、同じ結果型を持っている場合:

var task1 = SomeLongRunningOperation1(); 
var task2 = SomeLongRunningOperation2(); 
var task3 = SomeLongRunningOperation3(); 

var results = await Task.WhenAll(task1, task2, task3).ConfigureAwait(false); 
関連する問題