Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# http客户端在windows窗体应用程序中冻结_C#_Httpclient_Asp.net Web Api_Async Await - Fatal编程技术网

C# http客户端在windows窗体应用程序中冻结

C# http客户端在windows窗体应用程序中冻结,c#,httpclient,asp.net-web-api,async-await,C#,Httpclient,Asp.net Web Api,Async Await,我在跟踪,它在控制台应用程序中工作,但后来我在windows窗体应用程序中尝试,当in点击行wait client.GetAsync(“api/Branchs/1035”) 这有什么区别 控制台代码(此代码有效): 您正在等待异步任务的结果。它将阻止UI线程,直到该任务完成 不要等待按钮1\u单击事件处理程序中的完成。您看到了一个死锁。本质上,await将捕获一个“上下文”,并使用它来恢复async方法。在控制台应用程序中,此“上下文”是线程池上下文,但在UI应用程序中,此“上下文”是UI线程上

我在跟踪,它在控制台应用程序中工作,但后来我在windows窗体应用程序中尝试,当in点击行
wait client.GetAsync(“api/Branchs/1035”)
这有什么区别

控制台代码(此代码有效):


您正在等待异步任务的结果。它将阻止UI线程,直到该任务完成


不要等待
按钮1\u单击事件处理程序中的完成。

您看到了一个死锁。本质上,
await
将捕获一个“上下文”,并使用它来恢复
async
方法。在控制台应用程序中,此“上下文”是线程池上下文,但在UI应用程序中,此“上下文”是UI线程上下文

在调用堆栈的更上层,您正在调用
Wait
,它将阻塞该线程,直到任务完成。在控制台应用程序中,
async
方法在线程池线程上恢复;但是在UI应用程序中,
async
方法无法在UI线程上恢复(因为UI线程在调用
Wait
时被阻塞)

要解决此问题,请始终使用
async

private async void button1_Click(object sender, EventArgs e)
{
  await RunAsync();
}

下载完成后,您想做什么?我的应用程序将读取分支列表,然后客户端将选择其中一些分支放置在何处?您可以禁用在HTTP请求完成之前不应与之交互的任何表单元素(例如分支的列表框),然后在
RunAsync()的末尾重新启用该元素。查看为什么按钮1\u Click仍在尝试写入控制台?它不再是一个控制台应用程序了。@KenWhite是的,我的错,忘了那一行,我正试图从我的api中获得一些“分支”,然后客户端应该返回他喜欢的分支
private void button1_Click(object sender, EventArgs e)
    {
        RunAsync().Wait();
    }

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

            HttpResponseMessage response = await client.GetAsync("api/branches/1035");

            if (response.IsSuccessStatusCode)
            {
                Branch branch = await response.Content.ReadAsAsync<Branch>();
                Console.WriteLine("{0}\t${1}", branch.Id, branch.Color);
            }

        }
    }
private async void button1_Click(object sender, EventArgs e)
{
  await RunAsync();
}