我有一个.net核心应用程序接口,它有一个控制器,可以构建一个要返回的聚合对象。它创建的对象由来自对服务类的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);
}
这很有效,但是我想知道使用tasks是否是最好的解决方案?使用async/await会不会是一个更好的想法和更容易被接受的方式?
例如,控制器是否应该标记为async,并在每次调用服务方法时放置一个等待?
发布于 2017-01-31 17:05:09
据我所知,你想让它并行执行,所以我不认为你的代码有任何问题。正如Gabriel提到的,你可以等待任务的完成。
[HttpGet]
public async Task<IActionResult> myControllerAction()
{
var data1 = new sometype1();
var data2 = new sometype2();
var data3 = new List<sometype3>();
var t1 = Task.Run(() => { data1 = service.getdata1(); });
var t2 = Task.Run(() => { data2 = service.getdata2(); });
var t3 = Task.Run(() => { data3 = service.getdata3(); });
await Task.WhenAll(t1, t2, t3); // otherwise a thread will be blocked here
var data = new returnObject
{
d1 = data1,
d2 = data2,
d2 = data3
};
return Ok(data);
}
您还可以使用任务的结果来保存一些代码行,并使代码总体上“更好”(参见注释):
[HttpGet]
public async Task<IActionResult> myControllerAction()
{
var t1 = Task.Run(() => service.getdata1() );
var t2 = Task.Run(() => service.getdata2() );
var t3 = Task.Run(() => service.getdata3() );
await Task.WhenAll(t1, t2, t3); // otherwise a thread will be blocked here
var data = new returnObject
{
d1 = t1.Result,
d2 = t2.Result,
d2 = t3.Result
};
return Ok(data);
}
https://stackoverflow.com/questions/41953102
复制相似问题