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

时间:2016-02-12 01:38:34

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

我有一个MVC5项目,它在类库项目中使用服务和存储库。当我将以下代码作为MVC项目运行/调试时,执行挂起在“return await client.GetAsync(url);”在存储库中。没有例外。

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

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

// File: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);
}

// File: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!
    }
}

1 个答案:

答案 0 :(得分:7)

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

   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

,请参见此处