【发布时间】:2018-09-02 14:43:37
【问题描述】:
我们有一个运行由 IIS 编译的 C# 代码的 IIS 网站(这不是从 *.cs 文件运行的,它位于 aspx 页面上带有 <% %> 标记的代码中。没有使用 async 指令页面代码。我们有一个 .NET 库,其中包含一个公开异步方法的类。当我们尝试同步调用异步方法时,如下所示:
var articles = _cmsClient.GetAllArticlesAsync().Result;
页面无限期挂起。我们通过反复试验找到的解决方案是将异步调用包装在一个任务中:
List<Article> articles = null;
var wpLoadTask = Task.Run(async () =>
{
articles = await _cmsClient.GetAllArticlesAsync();
});
wpLoadTask.Wait();
这是有效的,但我很想知道为什么。
【问题讨论】:
-
bing.com/search?q=c%23+async+result+deadlock 如果一个解释还不够。请注意,您的代码仍会导致死锁,只是在比
.Result的标准死锁更具体的情况下。 -
@AlexeiLevenkov 这看起来像是根本原因,但这段代码没有遇到死锁(我们不是在谈论死锁,不是线程饥饿)。 Task.Run 不会创建一个新的线程上下文,允许生成一个新线程以完成吗?如果没有,这是如何工作的?
标签: c# asp.net webforms async-await