2016-08-12 68 views
1

我有下面的代碼,我不確定它是否要在當時運行一個任務,或者同時運行所有任務,並等待爲他們完成。等待一個任務列表,一次一個

Dictionary<TemporaryAdditionalData, Exception> rejected = new Dictionary<TemporaryAdditionalData, Exception>(); 

    await Task.WhenAll(additionalData 
     .SelectMaybe(async adda => 
      await this.InsertTemporallyAdditionalData(
       guid, adda.Order, adda.ID, adda.Value, adda.IsMandatory 
      ), 
      out rejected 
     ).ToArray() 
    ); 

    return rejected; 

我覺得SelectMaybe方法是不是與此有關,它只是一個擴展LINQ的Select自動捕獲異常並返回它們。

1)任務會一個接一個或全部同時運行?

2)無論對1的答案是什麼,我怎麼能寫相同的代碼來做相反的事情?

+1

運行代碼並找出它自己在做什麼。這是一個足夠簡單的測試。 – Servy

+0

@Servy我會嘗試,我可能不得不想出一個更簡單的相同邏輯版本,因爲我現在沒有資源來測試特定的實現。 –

+0

這是測試該行爲的最佳方式,是的。 – Servy

回答

3

任務將並行執行。如果你想讓它們按順序執行,你可以這樣寫一個簡單的循環:

foreach (var adda in additionalData) 
{   
    try 
    { 
     await this.InsertTemporallyAdditionalData(
      guid, adda.Order, adda.ID, adda.Value, adda.IsMandatory 
     ); 
    } 
    catch (Exception ex) 
    { 
     rejected[adda] = ex; 
    } 
} 
+0

不幸的是,這不起作用。由於某些原因,它們仍然在parallalel中執行 - 這可以通過由於其每個線程限制的單一異步操作而由「EF在上一次異步操作完成之前在此上下文中開始的第二個操作」吹拂來確認。有任何想法嗎? – Marchy