2016-02-20 84 views
2

我花了幾個小時查看clojurescript代碼,並嘗試將其使用的一些概念應用於C#。我經常發現我想要以匿名類型聚合一些獨立任務的結果,然後使用JSON序列化。匿名類型的聚合任務

我想盡量保持我的代碼的功能,所以我寫出來這樣的事情

return new 
{ 
      A = await CallServiceA(...), 
      B = await Task.WhenAll(someData.Select(Task.Factory.Create(()=>CallServiceB(....)) 
      C = await CallServiceC(...) 
} 

但是,它看起來像運行時將依次填充這些屬性,這意味着它會首先填充,然後是B,然後是C.

有什麼辦法可以讓這些屬性並行填充,並且仍然使用如上所述的緊湊語法,而不必分別聲明和啓動任務,並等待結果像這樣:

var taskA = Task.Create... 
var taskB = Task.WhenAl... 
var taskC = Task.Create... 
return new 
    { 
       A = await taskA, 
       B = await taskB, 
       C = await taskC 
    } 
+1

不是一個答案,但我只想指出,在99%的用例中,Task.Factory.StartNew()是錯誤的(t​​m)和邪惡(tm)http://blog.stephencleary.com/2013/ 08/startnew-is-dangerous.html – kai

回答

1

代碼片段2是正確的,代碼片段1確實是順序的(除了WhenAll輸入)。如果要聲明任務是獨立的,則聲明使用表單編號2的方式。

還要記住await不會啓動任務。它等待已經運行的任務。

+0

感謝您指出關於等待的細節。在玩弄任務而不爲你開始任務的方法時,犯錯誤真的很容易! –

+0

@MikaelNitell你應該幾乎從不創建或使用未分離的任務。這種用例非常罕見。反模式。 – usr

+0

我同意,但其中一個用例會「玩」:) :) –