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映射同步上下文并避免死锁吗? –