首页 > 解决方案 > HttpClient SendAsync 可以不阻塞 GUI 线程吗?

问题描述

Windows 窗体 GUI 线程在 async 期间不时停止一秒钟HttpClient SendAsync。除此之外,一切正常(我得到数据)。我想对不同的服务器进行频繁的并行请求,以频繁更新屏幕。我正在尝试启动多个请求,这些请求发布响应以供 GUI 线程稍后处理。下面的代码是我的代码的简化。我检查了之前和之后的时间SendAsync,发现它有时长达 2 秒,而 GUI 窗口被冻结(无法移动、滚动等)并且轮询计时器处于非活动状态(计数器从不增加)。

使用异步Task DoWork没有帮助。

class Worker
{
    HttpClient client = new HttpClient();
    bool busy = false;
    string data = "";
    //public async Task DoWork()
    public async void DoWork()
    {
        if ( busy ) return;
        busy = true;
        HttpRequestMessage request = new HttpRequestMessage(method, requestUrl);
        HttpResponseMessage response = await client.SendAsync( request );
        data = ... from response ...
        busy = false;
    }
}
int counter;
private void Update(object sender, EventArgs e)
{
    ++counter;
    foreach ( Worker worker in workers )
        worker.DoWork();
}
...
List<Worker> workers = ...
var poll = new System.Windows.Forms.Timer();
poll.Tick += Update;
poll.Interval = 250;
poll.Enabled = true;
...

标签: c#dotnet-httpclient

解决方案


SendAsync足够异步(即使它在内部使用线程)。更新 UI 本身真的很慢,是 UI 冻结的原因。


推荐阅读