我有一个 .net core 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 会是一个更好的想法和更容易接受的方式吗?
例如,是否应该将控制器标记为异步,并在每次调用服务方法时等待?
这很有效,但是我想知道使用任务是否是这里的最佳解决方案?使用 async/await 会是一个更好的想法和更容易接受的方式吗?
是的,一点没错。在 ASP.NET 上进行并行处理每个请求会消耗多个线程,这会严重影响您的可伸缩性。异步处理对于 I/O 来说要优越得多。
To use async
,首先从服务中某处的最低级别调用开始。它可能在某个时刻进行 HTTP 调用;更改为使用异步 HTTP 调用(例如,HttpClient
)。然后让async
从那里自然生长。
最终,你会得到异步的结果getdata1Async
, getdata2Async
, and getdata3Async
方法,可以同时使用:
[HttpGet]
public async Task<IActionResult> myControllerAction()
{
var t1 = service.getdata1Async();
var t2 = service.getdata2Async();
var t3 = service.getdata3Async();
await Task.WhenAll(t1, t2, t3);
var data = new returnObject
{
d1 = await t1,
d2 = await t2,
d3 = await t3
};
return Ok(data);
}
通过这种方法,当三个服务调用正在进行时,myControllerAction
uses zero线程而不是four.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)