使用 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);
在 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);