使用 return 值和 async/await 并行执行

Parallel execution with return values and async/await

在 C# 中处理要同时执行的部分代码的正确方法是什么?这些调用中的每一个大约需要 3 秒(我们目前正在对我们的系统进行索引改进)。如何使这些语句与结果并行执行?

var properties = await _propertyService.GetPropertiesAsync("Fairfax, VA");

var ratings = await _ratingsService.GetRatingsAsync(12549);

您可以从调用中删除 await 并等待 Task.WhenAll 的结果:

var propertiesTask = _propertyService.GetPropertiesAsync("Fairfax, VA");
var ratingsTask = _ratingsService.GetRatingsAsync(12549);
await Task.WhenAll(propertiesTask, ratingsTask);
var properties = propertiesTask.Result;
var ratings =  ratingsTask.Result;

或者拆分方法调用和等待(通常是less preferable选项):

var propertiesTask = _propertyService.GetPropertiesAsync("Fairfax, VA");
var ratingsTask = _ratingsService.GetRatingsAsync(12549);
var properties = await propertiesTask;
var ratings = await ratingsTask;

您可以使用 Task.WhenAll

Task.WhenAll 不会阻塞,可以等待,将控制权交还给调用者,直到所有任务完成(与 Task.WaitAll 相反)

就异常而言,如果任何提供的任务在故障状态下完成,则返回的任务也将在故障状态下完成,其中其异常将包含来自每个异常的未包装异常集的聚合提供的任务。

var task1 = _propertyService.GetPropertiesAsync("Fairfax, VA");
var task2 = _ratingsService.GetRatingsAsync(12549);

await Task.WhenAll(task1, task2);