C# HttpClient SendAsync不能阻止GUI线程吗?

C# HttpClient SendAsync不能阻止GUI线程吗?,c#,dotnet-httpclient,C#,Dotnet Httpclient,Windows窗体GUI线程在asyncHttpClient SendAsync期间不时会暂停一秒钟。除此之外,一切正常(我得到数据)。我想经常向不同的服务器发出并行请求,以便经常更新屏幕。我正在尝试启动多个请求,这些请求发布响应以供GUI线程稍后处理。下面的代码是我的代码的简化。 我检查了SendAsync之前和之后的时间,发现当GUI窗口冻结(无法移动、滚动等)且轮询计时器处于非活动状态(计数器从不递增)时,时间有时长达2秒 使用asyncTask-DoWork没有帮助 class Work

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

使用async
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;
...
类工作者
{
HttpClient=新的HttpClient();
bool busy=false;
字符串数据=”;
//公共异步任务DoWork()
公共异步void DoWork()
{
如果(忙)返回;
忙=真;
HttpRequestMessage请求=新的HttpRequestMessage(方法,requestUrl);
HttpResponseMessage response=等待客户端.SendAsync(请求);
数据=…来自响应。。。
忙=假;
}
}
整数计数器;
私有无效更新(对象发送方,事件参数e)
{
++计数器;
foreach(工人中的工人)
工人。道工();
}
...
列出工人=。。。
var poll=new System.Windows.Forms.Timer();
poll.Tick+=更新;
投票间隔=250;
poll.Enabled=true;
...

<代码> > p> >如果使用Windows,则可以考虑<代码>后台工作程序

< P>。窗体可以考虑<代码>后台工作> <代码> < /P> < P>代码> SDENASYNC/<代码>是完全异步的(即使它在内部使用线程)。
更新UI本身非常慢,导致UI冻结。

sendascync
非常异步(即使它在内部使用线程)。
更新UI本身非常慢,这是UI冻结的原因。

尝试共享客户端(声明为静态),HttpClient是一个沉重的对象,正确的使用方法是重用它。一个HttpClient可以用于多个服务器的多个同时请求吗?我每台服务器使用1台。提到SendAsync不是完全异步的,并且在内部使用线程池;threadpoll是否太小?您如何确定问题出在
GetAsync
上?问题不在于SendAsync,而在于GUI更新非常慢,无法共享客户端(声明为静态),HttpClient是一个沉重的对象,正确的使用方法是重用它。一个HttpClient可以用于多个服务器的多个同时请求吗?我每台服务器使用1台。提到SendAsync不是完全异步的,并且在内部使用线程池;threadpoll是否太小?您如何确定问题出在
GetAsync
上?问题不在于SendAsync,而在于GUI更新非常缓慢。BackgroundWorker允许将HttpClient工作从UI中分离出来——显然UI是瓶颈。我的测量方法有问题。谢谢。BackgroundWorker允许将HttpClient工作从UI中分离出来——显然UI是瓶颈。我的测量方法有问题。这不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。-我试图回答我自己的问题;问题不在于SendAsync,而在于DataGridView更新缓慢。通过将它们放在不同的线程上(BackgroundWorker)可以清楚地说明这一点。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。-我试图回答我自己的问题;问题不在于SendAsync,而在于DataGridView更新缓慢。通过将它们放在不同的线程上(BackgroundWorker),这一点很清楚。