后台worker+Socket中的C#进度条-进度条仅在套接字通信完成后更新
本文关键字:通信 更新 套接字 中的 worker+Socket 后台 | 更新日期: 2023-09-27 18:25:31
我在后台工作程序中遇到进度条问题。
public void UpdateDevices(object sender, EventArgs e) {
bw_1.RunWorkerAsync();
Thread.Sleep(100);
WebSwitchHandler.GetDeviceStats(NewRoom);
//Above line opnes a socket and takes 5 seconds to return back//
}
private void bw_1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 100; i++)
{
Thread.Sleep(100);
bw_1.ReportProgress(i);
}
}
private void bw_1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
进度条只有在套接字返回后才会更新。套接字类没有线程,它在5秒内阻塞了整个gui。
为什么这不起作用?以及如何使用GUI处理此问题的建议。
问题是因为UI线程正在更新进度条。但是UI线程"正忙于"等待GetDeviceStats
函数完成。因此,它无法处理进度条更新,直到它再次免费。
如果GetDeviceStats
函数是一个长时间运行的进程(对我来说是这样),那么最好将该工作包含在后台工作线程中。但是,在呼叫再次完成之前,您仍然无法报告进度(因此无法更新进度条)。
对此,一些可能的解决方案是让GetDeviceStats
在完成时报告进度(我不确定该函数实际做了什么,所以这可能不是一个选项),或者如果你需要"伪造"进度,那么使用第二个后台线程或计时器。
就我个人而言,我只想将进度条样式设置为"Marquee",这样用户就知道程序正忙于做一些事情,然后在一个后台工作人员上运行GetDeviceStats
函数。
实际上,您需要两个后台工作人员来实现使用进度条为您工作的GUI。你已经需要更新进度条了。
第二个可以用来作为异步操作调用WebSwitchHandler.GetDeviceStats(NewRoom);
,这样UI线程就不会被阻塞。完成这个BG工作人员后,您可以通知第一个立即完成,而不是总是等待固定的时间。这样你也可以优化你的等待时间。