使用 HttpClient.GetAsync 调用 Web API 似乎挂了

M K*_* II 5 c# asp.net task-parallel-library async-await asp.net-web-api

我正在研究概念原型的证明。
我有 Asp.Net C# web 表单(Visual Studio 2013,.Net 4.5)页面。单击按钮时,我会执行以下操作:

List<Blog> blogs = null;
protected void btnLoadData_Click(object sender, EventArgs e)
{
    //...;

    switch (int.Parse(rblDataSource.SelectedValue))
    {
        //...;

        case 4:
            RunAsyncBlogs().Wait();

            break;

        default:
            blogs = localGetter.GetBlogs();
            break;
    }

    //...;
}
Run Code Online (Sandbox Code Playgroud)

RunAsyncBlogs 看起来像这样:

static async Task RunAsyncBlogs()
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("http://localhost/wapiDemo/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        // HTTP GET
        HttpResponseMessage response = await client.GetAsync("api/Blogs");
        if (response.IsSuccessStatusCode)
        {
            List<Blog> thisBlogList = await response.Content.ReadAsAsync<List<Blog>>();
            var cnt = thisBlogList.Count();
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

代码在 response = await client.GetAsync 调用处停止。当我说它停止时,调试器就像请求已经结束,但浏览器仍在等待。

如果我运行以相同方式调用 Web API 的控制台应用程序(我将 RunAsync() 方法复制并粘贴到其中),我将获取我的数据。因此,我相信 Web API 应用程序正在按预期响应。

Yuv*_*kov 4

这:

 RunAsyncBlogs().Wait();
Run Code Online (Sandbox Code Playgroud)

使您的代码陷入僵局。它同步阻止您的异步方法调用,该调用试图将延续封送回隐式捕获的同步上下文。这就是为什么你不应该阻止异步代码

protected async void btnLoadData_Click(object sender, EventArgs e)
{
   // Other stuff
   await RunAsyncBlogs();
}
Run Code Online (Sandbox Code Playgroud)