【问题标题】:ASP.NET call hangs on async awaitASP.NET 调用在异步等待时挂起
【发布时间】:2015-06-05 21:54:03
【问题描述】:

当使用异步等待按顺序调用时,我从 IIS express 中的 API 控制器对 Google API 的调用无限期挂起。

var id = CreateDocument("My Title").Result;

async Task<string> CreateDocument(string title)
{
    var file = new GData.File { Title = title };
    // Stepping over this line in the debugger never returns in IIS Express.
    file = await Service.Files.Insert(file).ExecuteAsync();
    return file.Id;
}

它不会挂起从测试控制台应用程序调用相同的方法。

当使用相应的同步方法调用时,同样的逻辑也不会挂起 IIS Express。

var id = CreateDocument("My Title");

string CreateDocument(string title)
{
    var file = new GData.File { Title = title };
    // This has no problem
    file = Service.Files.Insert(file).Execute();
    return file.Id;
}

我应该在哪里寻找缺陷?

【问题讨论】:

    标签: asp.net async-await iis-express


    【解决方案1】:

    缺陷就在这里:

    var id = CreateDocument("My Title").Result;
    

    正如我在博客中解释的那样,you should not block on async code

    await代替Result

    var id = await CreateDocument("My Title");
    

    【讨论】:

    • 有趣的是,我在发帖之前简要浏览了您的博文。乍一看,它似乎不适用于我的情况。我现在当然明白了。显然,缺陷不是一条线,但我很欣赏你的观点。在某些时候,异步必须被解包,在这种情况下,它恰好是由理解环境的强制单线程性质的提供者提供的。准确吗?
    • 具有讽刺意味的是,当我第一次查看 API 控制器上的异步方法时,我正试图掌握这一点。我已经意识到单线程的性质,当然我出于其他原因依赖它。所以我突然想到,异步方法一定有一个最终的“接收器”。
    • @shannon:从技术上讲,它不是单线程的。但是您是正确的,因为 ASP.NET 理解 Task 返回类型的含义,并且在该任务完成之前不会完成响应。
    猜你喜欢
    • 2019-03-06
    • 1970-01-01
    • 2018-09-02
    • 2018-07-09
    • 2016-10-06
    • 2021-06-14
    • 2018-04-28
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多