gpt4 book ai didi

c# - 将 Task.WhenAll 用于多个异步和伪异步方法

转载 作者:行者123 更新时间:2023-11-30 14:21:38 25 4
gpt4 key购买 nike

我的一位同事重构了我们的 Controller 方法,以便我们所有的 IO 操作(包括同步操作)都封装在单独的任务中,然后所有这些任务通过 Task.WhenAll 并行执行.我完全可以理解这个想法:我们使用更多的线程,但我们所有的 IO 操作(我们可以有很多)都以最慢的速度执行,但我仍然不确定这是否是正确的路径.这是一种有效的方法还是我遗漏了什么?在典型的 ASP.Net 网站应用程序中使用更多线程的成本是否会很明显?这是一些示例代码

public async Task<ActionResult> Foo() {
var dataATask = _dataARepository.GetDataAsync();
var dataBTask = Task.Run(_dataBRepository.GetData());
await Task.WhenAll(dataATask, dataBTask);
var viewModel = new ViewModel(dataATask.Result, dataBTask.Result);
return View(viewModel);
}

最佳答案

一般来说,您的代码是可以的 - 它会比原来消耗更多的线程和更多的 CPU,但除非您的网站负载很重,否则不太可能显着影响整体性能。显然,您需要针对您的特定负载自行测量(包括 5-10 倍常规流量的某种压力级别负载)。

Task.Run 中包装同步方法不是最佳实践(参见 Should I expose asynchronous wrappers for synchronous methods? )。只要您的情况可以接受为此类行为交换额外的线程,它就可能对您有用。

如果您只剩下一个同步操作,您可以改为保持同步并在同步步骤结束时等待其余操作以保存该额外线程:

var dataATask = _dataARepository.GetDataAsync();
var dataBTaskResult = _dataBRepository.GetData();
await Task.WhenAll(dataATask); // or just await dataATask if you have only one.
var viewModel = new ViewModel(dataATask.Result, dataBTaskResult);

关于c# - 将 Task.WhenAll 用于多个异步和伪异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53824866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com