c# - 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;
...
解决方案
SendAsync
足够异步(即使它在内部使用线程)。更新 UI 本身真的很慢,是 UI 冻结的原因。
推荐阅读
- android - AdMob 不适用于某些应用程序 ID - 测试中
- javascript - 如何在vuejs中刷新accesstoken而不使用axios拦截器进行全页刷新
- java - OCA8 Java 认证问题 - Java Operators
- python - 以编程方式将文件夹添加到 PYTHONPATH
- python - 仅附加第一个对象
- css - CSS 在部署到 Google Cloud Run 的 Laravel 项目中不起作用
- c# - 带参数的 Powershell 反射调用
- npm - TypeError:没有'new'就不能调用类构造函数{class}
- r - 无法创建将 R 连接到 Twitter 的令牌
- django - 使用 Django 在 Google 图表表中传递元组