C# .Net Core Async Await未继续执行
我有一个任务列表,它将restfully调用Web服务。我在调用downloadTasksQuery.ToList时开始执行它们。在这一点上,我希望在每个任务完成时对其进行处理,并在完成后将距离添加到数据库中 当我在控制台里看这个的时候。所有记录似乎都同时打印到控制台,我看到了这一行的输出。Console.WriteLine谷歌距离:+d.Google\u距离 它打印到控制台的次数是要开始的任务列表中的次数C# .Net Core Async Await未继续执行,c#,asp.net-core,async-await,C#,Asp.net Core,Async Await,我有一个任务列表,它将restfully调用Web服务。我在调用downloadTasksQuery.ToList时开始执行它们。在这一点上,我希望在每个任务完成时对其进行处理,并在完成后将距离添加到数据库中 当我在控制台里看这个的时候。所有记录似乎都同时打印到控制台,我看到了这一行的输出。Console.WriteLine谷歌距离:+d.Google\u距离 它打印到控制台的次数是要开始的任务列表中的次数 IEnumerable<Task<Distances>> dow
IEnumerable<Task<Distances>> downloadTasksQuery =
(from tup in urlList select ProcessURL(tup));
List<Task<Distances>> downloadTasks = downloadTasksQuery.ToList();
while (downloadTasks.Count > 0)
{
Task<Distances> thisFinished = await Task.WhenAny(downloadTasks);
downloadTasks.Remove(thisFinished);
try
{
Distances d = await thisFinished;
if (d.has_error == false)
{
dr.Add(d);
}
else
{
dr.AddError(d);
}
Console.WriteLine(" Google Distance : " + d.google_distance);
}
catch (Exception e)
{
Console.WriteLine("Deleted task, did not save data");
}
}
进程URL
我建议使用ContinueWith,因为它似乎更适合您正在尝试的工作:
var runningTasks = urlList.Select(tup => ProcessURL(tup)
.ContinueWith(task =>
{
var d = task.Result;
if (d.has_error)
dr.AddError(d);
else
dr.Add(d);
Console.WriteLine(" Google Distance : " + d.google_distance);
}));
await Task.WhenAll(runningTasks);
ProcessURL做什么?请提供一个。@JonSkeet我已经提供了更多详细信息。这似乎更适合继续。显然,第一步是将时间戳添加到所有日志中,并将日志添加到ProcessURL中。也许所有的任务都在同一时间完成?或者控制台被缓冲了?
var runningTasks = urlList.Select(tup => ProcessURL(tup)
.ContinueWith(task =>
{
var d = task.Result;
if (d.has_error)
dr.AddError(d);
else
dr.Add(d);
Console.WriteLine(" Google Distance : " + d.google_distance);
}));
await Task.WhenAll(runningTasks);