2015-06-05 29 views
12

我試圖決定如何等待所有異步任務完成。傳遞給Task.WhenAll()失敗的任務時使用ConfigureAwait(false)

下面是代碼我現在有

[HttpGet] 
public async Task<JsonResult> doAsyncStuff() 
{ 
    var t1 = this.service1.task1(); 
    var t2 = this.service2.task2(); 
    var t3 = this.service3.task3(); 
    var t4 = this.service4.task4(); 

    await Task.WhenAll(t1,t2,t3,t4); 
    return this.Json(new {redirect = true, href = Url.Action("Blah")}, JsonRequestBehavior.AllowGet); 
} 

我敢肯定的同步上下文是不相關的,所以我嘗試這樣做。

[HttpGet] 
public async Task<JsonResult> doAsyncStuff() 
{ 
    var t1 = this.service1.task1().ConfigureAwait(false); 
    var t2 = this.service2.task2().ConfigureAwait(false); 
    var t3 = this.service3.task3().ConfigureAwait(false); 
    var t4 = this.service4.task4().ConfigureAwait(false); 

    await Task.WhenAll(t1,t2,t3,t4); 
    return this.Json(new {redirect = true, href = Url.Action("Blah")}, JsonRequestBehavior.AllowGet); 
} 

的問題是現在Task.WhenAll有無效的參數,因爲它不會接受配置的任務Awaiatables。

所以Task.WhenAll需要與此

await t1; await t2; await t3; await t4; 

更換這似乎不是正確的我,但幾乎無處不任何人有什麼說ConfigureAwait它是「使用它,如果它不」 t錯誤「。據我所知(我沒有寫任務),他們不使用同步上下文,也不依賴它。

重要提示我希望task1到task4同時運行,因爲它們不依賴於前一個完成。因此,我不想在每個任務前等待。但是我不想返回Json響應,直到完成所有4個響應爲止,這就是爲什麼我當前在當前代碼中具有正在等待Task.WhenAll()的原因。

+0

定義*更好* ... –

+1

我更新您的標題是一個小更具有代表性的實際問題和問題你有,如果你想,你可以改回它,但「哪個更好」的問題是不被接受的,並且可能會導致人們沒有閱讀你真正的問題的膝蓋反應。 –

+0

這是「Configure * Await *」,而不是「Configure * Task *」。 –

回答

28

您只需要ConfigureAwait當你真正執行await,正確的形式是

[HttpGet] 
public async Task<JsonResult> doAsyncStuff() 
{ 
    var t1 = this.service1.task1(); 
    var t2 = this.service2.task2(); 
    var t3 = this.service3.task3(); 
    var t4 = this.service4.task4(); 

    await Task.WhenAll(t1,t2,t3,t4).ConfigureAwait(false); 
    return this.Json(new {redirect = true, href = Url.Action("Blah")}, JsonRequestBehavior.AllowGet); 
} 
+3

@YuvalItzchakov兩個任務都不會做。 'ConfigureAwait'修改'await'的行爲,而不是你正在等待的任務的行爲。你不會有機會改變SyncContexts,直到你點擊一個'await',所有4個任務仍然會在線程進入的同步上下文中開始,即使他確實在每行放了'ConfigureAwait',然後執行'await t1;等待t2;等待t3;等待t4;'最後。 –

+0

@ScottChamberlain你說得對。我不知何故混淆了它。 –

+0

@ScottChamberlain謝謝,這使得更多的感覺和看起來更清潔。出於某種原因,互聯網上充斥着即時等待的解決方案,對我來說似乎很奇怪,沒有人想到實際上異步執行多個任務。 – vipero07

相關問題