【发布时间】:2018-07-26 07:25:15
【问题描述】:
我正在将旧的 Asp.Net WebForms 项目升级到 .net 4.7。
在我的配置中,我将目标框架设置为 4.7,并将同步上下文设置为使用新的 AspNetSynchronizationContext(尽管我相信如果省略后者是隐含的)以允许新的 async / await 方法工作,例如
<httpRuntime targetFramework="4.7" />
...
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
但后来我发现 很多 行代码如下:
var myTask = DoSomethingAsync();
return myTask.Result;
未等待任务结果导致应用挂起。
如果我将配置更改为使用LegacyAspNetSynchronizationContext ...
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="false" />
... 旧的非等待代码再次工作,新的 async/await 方法出现 工作。我在this MSDN article 中读到时说“出现”:
除非已设置此开关,否则 ASP.NET 中未定义 async / await 的行为
为什么它是未定义的?这是否意味着行为是不可预测的或根本不起作用?
如果我有如下的 sn-p 代码,当它在 LegacyAspNetSynchronizationContext 中调用时会发生什么或可能发生什么?
public async Task<bool> DoSomethingElseAsync()
{
return await CallSomeApiAsync().ConfigureAwait(false);
}
【问题讨论】:
-
“未定义”表示“尚未定义”。 ASP.NET 团队还没有正式定义系统应该做什么,所以你不能对你的代码做什么有任何期望。它可能工作正常,也可能什么都不做,它可能会导致您的服务器在 eBay 上出售自己。
标签: c# asp.net webforms async-await .net-4.7