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

thd*_*thd 1 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
}
Run Code Online (Sandbox Code Playgroud)

//文件: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);
}
Run Code Online (Sandbox Code Playgroud)

//文件: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!
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 7

您应该使控制器方法异步而不是阻止.Result(导致死锁).你的控制器动作应该是这样的

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

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

        //More code
    }
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此处http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html