C# 任务异步编程同步运行
通过阅读下面的指南,我试图创建三个任务,它们应该异步并发运行,但实际上是同步运行的。我想知道我错在哪里C# 任务异步编程同步运行,c#,asynchronous,task,C#,Asynchronous,Task,通过阅读下面的指南,我试图创建三个任务,它们应该异步并发运行,但实际上是同步运行的。我想知道我错在哪里 Task<double?[]> rainfallGridValuesTask = Rainfall.ValuesAsync(rainfallGridValuesRepo.GetAll()); //it takes 5s Task<double?[]> rainfallAvgValuesTask = Rainfall.AveragesAsync(rainfallAvgG
Task<double?[]> rainfallGridValuesTask = Rainfall.ValuesAsync(rainfallGridValuesRepo.GetAll()); //it takes 5s
Task<double?[]> rainfallAvgValuesTask = Rainfall.AveragesAsync(rainfallAvgGridValuesRepo.GetAll()); //it takes 5s
Task<double?[][]> rainfallAnomaliesTask = Rainfall.AnomaliesAsync(rainfallGridValuesRepo.GetAll()); //it takes 5s
但是,当我运行这段代码时,它会在三个异步方法中的每一个上等待5秒,那么有什么不对?我如何并发运行它们并在所有任务完成后继续?正如注释所指出的,使用
等待任务延迟(TimeSpan.FromSeconds(5)),而不是系统.Threading.Thread.Sleep(5000)
代码>。这将模拟在每个等待的任务中执行5秒的I/O(而不是5秒的CPU计算)。异步方法仅在第一次调用“wait”时是异步的。替换系统.线程.线程.睡眠(5000)代码>等待任务。延迟(5000)代码>异步就是更有效地使用单个线程。这与并发和多线程应用程序无关。这些应用程序应该执行5秒的CPU密集型计算吗?那么你的模拟是相当好的,观察是有效的。他们应该执行5秒的I/O吗?然后您应该切换到wait Task.Delay
进行模拟。@Giox:只要实际方法在内部使用wait
,您就应该使用wait Task.Delay()进行模拟。如果他们没有在内部使用wait
,而是使用其他异步/重叠系统,如BeginXYZ/EndXYZ或回调,则可以制作与等待任务兼容的包装器。此外,请不要忽略编译器警告。有一个编译器警告,字面意思是值
将同步运行。
public static async Task<double?[]> Values(IQueryable<RainfallGridValue> rainfallGridValues)
{
double?[] outputValues = new double?[108];
System.Threading.Thread.Sleep(5000); //Simulate the time taken by the method
return outputValues;
}
rainfallValueChart.Data = await rainfallGridValuesTask;
rainfallAverageChart.Data = await rainfallAvgValuesTask ;
rainfallAnomalyChart.Data = await rainfallAnomaliesTask ;