C#   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c# – 将Task.WhenAll用于多个异步和伪异步方法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我的一位同事重构了我们的控制器方法,以便我们所有的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-10x常规流量的某种压力水平负载).

在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用于多个异步和伪异步方法全部内容,希望文章能够帮你解决c# – 将Task.WhenAll用于多个异步和伪异步方法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。