C# HttpClient PostAsync/GetAsync 卡死/假死/死锁 异步编程 详解
C# HttpClient PostAsync 卡死/假死/死锁 详解
注意:为了避免阅读本文产生误解,本文在撰写过程中,部分使用了PostAsync
,部分使用了GetAsync
,均视为一个表述
例子
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Method().GetAwaiter().GetResult();// 这里为同步等待
button1.Text = "End";
}
private async Task<string> Method()
{
HttpClient client = new HttpClient();
// 发送 GET 请求
HttpResponseMessage response = await client.PostAsync("https://baidu.com/");
// 读取响应内容
string responseBody = await response.Content.ReadAsStringAsync();
return responseBody;
}
}
产生的场景
在Winform或Asp.net这类使用主线程的应用程序中,并且在主线程使用了同步等待(除了await Method()
这类方式以外都是同步等待)的情况下,子方法调用HttpClient
的await PostAsync
方法时会导致死锁。(控制台程序没这个问题,控制台是单线程)