HttpClient SendAsync可以不阻止GUI线程吗?

时间:2019-05-05 12:36:32

标签: c# dotnet-httpclient

Windows Forms GUI线程现在在异步HttpClient SendAsync期间停滞一秒钟。除此之外,一切正常(我得到数据)。我想经常向不同的服务器发出并行请求,并希望经常更新屏幕。我正在尝试启动多个请求,这些请求将响应发布到以后由GUI线程处理。下面的代码是我的代码的简化。 我检查了SendAsync之前和之后的时间,发现GUI窗口冻结(无法移动,滚动等)并且轮询计时器处于不活动状态(计数器从未增加)时,有时有时最多需要2秒)。

使用异步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;
...

2 个答案:

答案 0 :(得分:0)

如果您使用的是Windows.Forms,则可以考虑使用BackgroundWorker

答案 1 :(得分:0)

SendAsync是足够异步的(即使它在内部使用线程)。 UI本身的更新确实很慢,并且导致UI冻结。