2024年2月

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()这类方式以外都是同步等待)的情况下,子方法调用HttpClientawait PostAsync方法时会导致死锁。(控制台程序没这个问题,控制台是单线程)

- 阅读剩余部分 -