2016-07-07 145 views
2

我有一個控制檯應用程序,我希望一個接一個地啓動任務。Task.Wait()不等待任務完成

這裏是我的代碼:

static void Main() 
{ 
    string keywords = "Driving Schools,wedding services"; 
    List<string> kwl = keywords.Split(',').ToList(); 

    foreach(var kw in kwl) 
    { 
     Output("SEARCHING FOR: " + kw); 
     Task t = new Task(() => Search(kw)); 
     t.Start(); 
     t.Wait(); 
    } 

    Console.ReadLine(); 
} 

static async void Search(string keyword) 
{ 
    // code for searching 
} 

的問題是,它不等待第一個任務完成執行。它同時觸發後續任務。

我正在使用限速API,所以我想一個接一個地做。

爲什麼在開始下一個搜索之前它不會等待一個搜索完成?

+0

搜索方法使用的一些方法必須被異步調用,並且在初始嘗試正常調用時出現錯誤,所以我嘗試了這種方式,並且它工作正常。 – Guerrilla

+0

也理解這種行爲是完美的,你正在等待任務包裝一個異步方法,這將有一個'await',這將返回和'任務等待'完成,所以你不能抱怨 –

回答

10

您的async方法只是返回void,這意味着沒有任何簡單的方法可以完成任何等待它。 (你應該總是避免使用async void方法,它們只能用於訂閱事件。)你的任務只需要調用Search,並且你正在等待「我調用了方法」來完成.. 。它幾乎立即。

目前尚不清楚爲什麼你使用異步可言,如果你真的想連續做的事情,但我建議改變你的代碼看起來更象這樣:

static void Main() 
{ 
    // No risk of deadlock, as a console app doesn't have a synchronization context 
    RunSearches().Wait(); 
    Console.ReadLine(); 
} 

static async Task RunSearches() 
{ 
    string keywords = "Driving Schools,wedding services"; 
    List<string> kwl = keywords.Split(',').ToList(); 

    foreach(var kw in kwl) 
    { 
     Output("SEARCHING FOR: " + kw); 
     await Search(kw); 
    }    
} 

static async Task Search(string keyword) 
{ 
    // code for searching 
} 
+0

另外異步無效任何異常可以終止哪個進程不是異步的行爲任務 –

+0

謝謝!搜索功能正在使用一些異步功能,我有點困惑如何從主要方法開始。我按照你的建議更新了我的代碼,現在它效果很好!非常感謝Skeet先生。 – Guerrilla

+0

@Jon Skeet for Non Console應用程序應該使用Task.WhenAll映射同步上下文並避免死鎖嗎? –