2013-05-02 40 views
5

我有Task<bool>List,我要重複它,這取決於期待已久的結果,我決定是否繼續或中斷,但具有諷刺意味的foreach剛剛執行的任務和等待關鍵字不起作用等待裏面的foreach關鍵詞,

這裏是我的代碼

private async void Execute(object sender, EventArgs e) 
{ 
    var tList = new List<Task<bool>> { Method1(), Method2()}; 

    foreach (var task in tList) 
    { 
     var result = await task; 

     if(!result) 
      break; 
    } 
} 

public async Task<bool> Method1() 
{ 
    await Task.Delay(1000); 
    Console.WriteLine("Method1"); 
    return false; 
} 

public async Task<bool> Method2() 
{ 
    await Task.Delay(1000); 
    Console.WriteLine("Method2"); 
    return true; 
} 

結果:兩種功能都執行。

問題:我怎麼能在foreach裏面等待?

謝謝提前。

+0

'Method1()'返回'true',所以我期待你的循環繼續。也就是說,這裏有一個基本問題:在啓動循環之前,您正在開始執行這兩項任務,因此即使第一個任務返回「false」,第二個任務也可能已經完成。你仍然會忽略任何進一步的*結果*,但你不一定會跳過這些結果的計算。 – dlev 2013-05-02 23:49:46

+0

對不起**編輯它**具有相同的結果,並且如果返回false它應該會中斷。 – 2013-05-02 23:50:26

回答

9

您可以像現在一樣在foreach中使用await

結果:兩個函數都執行。

兩個函數都應該執行。在Method2返回之前,result未設置爲false,此時兩者都已經運行。您還在await之前啓動了兩個Task<bool>實例,因此兩者都(可能)在您的foreach循環之前運行。

扭轉你的方法的順序,他們將不能同時一定運行(儘管它們可能,因爲你開始他們):

var tList = new List<Task<bool>> { Method2(), Method1()}; 

如果您想徹底耽誤這一點,你可以寫爲:

var tList = new List<Func<Task<bool>>> { Method2, Method1}; 

foreach (var taskFunc in tList) 
{ 
    var result = await taskFunc(); 

    if(!result) 
     break; 
} 
+2

正如我在我對這個問題的評論中提到的那樣,僅僅因爲你不「等待」一個特定的任務並不意味着它不會運行*。問題是這兩個方法都是在循環之前運行的,因此無論是否等待,它們都會在某個時間點完成(因爲顯然沒有取消發生。) – dlev 2013-05-02 23:54:17

+0

@dlev非常真實... – 2013-05-02 23:54:48

+0

請參閱文章編輯相同的結果。我想要發生的事情是,如果第一個方法返回false,則不執行第二個方法... – 2013-05-02 23:55:36