Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务异步编程同步运行_C#_Asynchronous_Task - Fatal编程技术网

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 ;