C# http客户端在windows窗体应用程序中冻结
我在跟踪,它在控制台应用程序中工作,但后来我在windows窗体应用程序中尝试,当in点击行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线程上
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();
}