【发布时间】:2023-04-11 05:42:01
【问题描述】:
我有一个 ASP.NET MVC 异步操作方法,如下所示:
public async Task<ActionResult> IndexAsync()
{
var tasks = new List<Task<string>>
{
GetSomethingAsync("a"),
GetSomethingAsync("b")
};
await Task.WhenAll(tasks);
return View();
}
private async Task<string> GetSomethingAsync()
{
var data = await _someService.GetSomethingAsync().ConfigureAwait(false);
return data.SomeData;
}
现在,当我调试并跳过 tasks 变量创建时,任务会立即执行。换句话说,当我将鼠标悬停在await 行中的tasks 上时,他们会说“RanToCompletion”。
为什么?
据我了解,应该创建任务,但在被 await Task.WhenAll(tasks) 阻塞调用触发之前处于“WaitingForActivation”状态。
有人可以向我解释发生了什么吗?我以前写过这样的代码,它通常按预期工作,所以我想知道这是 ASP.NET 还是 ASP.NET MVC 异步控制器?
TIA。
编辑 如果我将代码更改为:
var tasks = new List<Task<string>>
{
Task.Run(() => GetSomethingAsync("a")),
Task.Run(() => GetSomethingAsync("b"))
};
该方法按预期运行(直到await 才执行任务)。
在运行异步任务之前,我通常从不需要这样做,这在 ASP.NET MVC 中是否需要?
【问题讨论】:
-
我敢打赌`_someService.GetSomethingAsync()`是同步的...
-
ConfigureAwait(false) 导致等待在当前上下文之外启动任务
-
@AlexeiLevenkov 啊,你是对的。这是“假的”异步/等待。签名都是 async/await,但底层代码实际上是一个同步的 REST 调用。这就是为什么......因为没有返回实际的任务。 ://
-
@StenPetrov 是的,但这仅与捕获的上下文有关,与执行模式无关,对吧?应该没关系。
标签: c# asp.net-mvc async-await asynccontroller