Task.Wait()不等待任务完成
我有一个控制台应用程序,我希望一个接一个地启动任务。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,所以我想一个接一个地做。
为什么在开始下一个搜索之前它不会等待一个搜索完成?
您的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
}
另外异步无效任何异常可以终止哪个进程不是异步的行为任务 –
谢谢!搜索功能正在使用一些异步功能,我有点困惑如何从主要方法开始。我按照你的建议更新了我的代码,现在它效果很好!非常感谢Skeet先生。 – Guerrilla
@Jon Skeet for Non Console应用程序应该使用Task.WhenAll映射同步上下文并避免死锁吗? –
搜索方法使用的一些方法必须被异步调用,并且在初始尝试正常调用时出现错误,所以我尝试了这种方式,并且它工作正常。 – Guerrilla
也理解这种行为是完美的,你正在等待任务包装一个异步方法,这将有一个'await',这将返回和'任务等待'完成,所以你不能抱怨 –