【发布时间】:2017-06-16 15:00:28
【问题描述】:
我有一个 .net 核心 API,它有一个控制器,用于构建一个聚合对象以返回。 它创建的对象由来自对服务类的 3 个方法调用的数据组成。这些都是相互独立的,可以相互隔离运行。 目前我正在使用任务来提高这个控制器的性能。当前版本看起来像这样......
[HttpGet]
public IActionResult myControllerAction()
{
var data1 = new sometype1();
var data2 = new sometype2();
var data3 = new List<sometype3>();
var t1 = new Task(() => { data1 = service.getdata1(); });
t1.Start();
var t2 = new Task(() => { data2 = service.getdata2(); });
t2.Start();
var t3 = new Task(() => { data3 = service.getdata2(); });
t3.Start();
Task.WaitAll(t1, t2, t3);
var data = new returnObject
{
d1 = data1,
d2 = data2,
d2 = data3
};
return Ok(data);
}
这很好,但是我想知道使用任务是否是最好的解决方案?使用 async/await 会是更好的主意和更被接受的方式吗?
例如,控制器是否应该被标记为异步并在每次调用服务方法时放置等待?
【问题讨论】:
-
service不为getdata方法提供异步替代方案吗?此外,通常您应该更喜欢Task.Run(),而不是创建任务然后手动启动它们。 -
async/await 在这个意义上对并行性没有帮助。实际上,它会序列化您的 3 个服务请求。但是,当您执行
Task.WaitAll时,它会有所帮助,因为您正在用该行停放一个线程。 -
根本没有理由创建冷任务然后对它们调用
Start。它们不是线程。只需使用Task.Run。然后使用await Task.WhenAll
标签: c# .net asp.net-web-api asp.net-core