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;
...
答案 0 :(得分:0)
如果您使用的是Windows.Forms,则可以考虑使用BackgroundWorker
答案 1 :(得分:0)
SendAsync
是足够异步的(即使它在内部使用线程)。
UI本身的更新确实很慢,并且导致UI冻结。