c# - 当 MVC 客户端时执行挂起,但当客户端是控制台应用程序或测试项目时执行正常

标签 c# asp.net-mvc async-await

我有一个 MVC5 项目,它使用类库项目中的服务和存储库。当我将以下代码作为 MVC 项目运行/调试时,执行卡在“return await client.GetAsync(url);”处在存储库中。不抛出异常。

如果我从单元测试或控制台应用程序调用相同的服务代码和存储库代码,那么代码可以正常工作。

代码有什么问题或我做错了什么?

//文件:TestController.cs

public ActionResult Index(string q)
{
    //Code

    var mySvc = new MyService();
    var svcResponse = mySvc.GetAsync(q).Result;

    //More code
}

//文件:MyService.cs

public async Task<MyResponse> GetAsync(string q)
{
    var myRepo = new MyRepository();
    var response = await myRepo.GetAsync(q);
    var json = await response.Content.ReadAsStringAsync();
    return JsonConvert.DeserializeObject<MyResponse>(json);
}

//文件:MyRepository.cs

public async Task<HttpResponseMessage> GetAsync(string q)
{
    var url = URL_CONSTANT + q;
    using (var client = new HttpClient())
    {
        return await client.GetAsync(url);   //Execution hangs here when MVC!
    }
}

最佳答案

您应该使您的 Controller 方法异步,而不是在 .Result 上阻塞(这会导致死锁)。你的 Controller Action 应该是这样的

   public async Task<IActionResult> Index(string q)
    {
        //Code

        var mySvc = new MyService();
        var svcResponse = await mySvc.GetAsync(q);

        //More code
    }

有关更多详细信息,请参见此处的示例 http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

关于c# - 当 MVC 客户端时执行挂起,但当客户端是控制台应用程序或测试项目时执行正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35353385/

相关文章:

C# 从 Word 文档中检索 FormFields 并插入到文本文件中

asp.net-mvc - 是否应该在 Razor View 中使用函数?

c# - 任务等待与 Task.WaitAll

jquery - 我可以将整数数组附加到 Json 对象并传递给 Controller ​​方法吗?

c# - MVC 自定义路由。 DataTokens ["Namespaces"] 被忽略

c# - 阻止并发调用者并从异步方法返回单个结果

c# - 在 void 方法中使用异步等待

c# - SignalR 2.2 回退传输耗尽 - 连接不可靠

c# - 检测字符串是否包含大写字符

c# - 仅作为时间将时间字符串转换为 24 小时制