【发布时间】:2017-07-07 15:25:58
【问题描述】:
我是 async / await 的新手,一直在尝试在我的 4.6 web api 2 项目中实现它。
public class MyController : ApiController
{
public async Task<Thing> Search(String searchTerms)
{
myThing = new Thing();
myThing.FirstProperty = await doFirstPropertyAsync(searchTerms);
myThing.SecondProperty = await doSecondPropertyAsync(searchTerms);
return myThing;
}
}
基本上,我返回一个类 (Thing),它有两个属性,每个属性都需要几秒钟来填充。我实际上加载了大约 10 个属性,但它们的逻辑相同。
public async Task<MyCoolSubObject> doFirstPropertyAsync(string searchTerms)
{
SomeController sController = new SomeController();
Debug.WriteLine("first - starting.");
var x = await Task.Run(()=>sController.Lookup(searchTerms));
Debug.WriteLine("first - finishing.");
return x;
}
public async Task<MyCoolSubObject> doSecondPropertyAsync(string searchTerms)
{
SomeOtherController sController = new SomeOtherController();
Debug.WriteLine("second - starting.");
var x = await Task.Run(()=>sController.Lookup(searchTerms));
Debug.WriteLine("second - finishing.");
return x;
}
是什么让我摸不着头脑:
当我查看调试输出时,第一个属性分配方法调用开始并在第二个完成之前完成。同样,我实际上有其中的十个,无论我将属性分配按什么顺序排列,它们都以串行方式完成(即:在另一个完成之前什么都没有开始)。
这些属性分配基本上是在执行需要一段时间的数据库调用,因此我希望它们尽可能并行运行。方法本身( SomeController.Lookup(string) )不包含等待/异步/任务的东西。
【问题讨论】:
-
“当我查看调试输出时,第一个属性分配方法调用开始并在第二个完成之前完成”,这听起来很准确。如果您希望这些并行运行,async/await 可能不是正确的工具。 Promise.all() 会更有用。
-
它串行运行(一个语句接着另一个语句),而不是“同步”(阻塞一个线程)。这就是
await所做的;要同时执行多个异步操作,请使用Task.WhenAll。此外,您不应该在 ASP.NET 上使用Task.Run- 这种异步过同步首先破坏了异步代码的目的。
标签: async-await asp.net-web-api2 task-parallel-library .net-4.6