![](/img/trans.png)
[英]wpf c# progress bar wont update untill after work is done when in background worker
[英]C# Progress Bar in background worker + Socket - Progress bar only updates after socket comm is done
我在后台工作程序中遇到进度栏问题。
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;
}
仅在套接字返回后,进度条才会更新。 套接字类没有线程,它将阻塞整个GUI 5秒钟。
为什么不起作用? 并建议我应该如何使用GUI处理此问题。
问题是因为进度条正在由UI线程更新。 但是UI线程“忙”等待GetDeviceStats
函数完成。 因此,它无法处理进度栏更新,直到它再次变为免费。
如果GetDeviceStats
函数是一个长期运行的过程(对我来说是这样),那么最好将其纳入后台工作线程中。 但是,在呼叫再次结束之前,您仍然无法报告进度(并因此更新进度条)。
一些可能的解决方案是要么在完成时让GetDeviceStats
报告进度(我不确定该函数实际做什么,所以这可能不是一个选择),或者如果您需要“伪造”进度,然后使用第二个后台线程或计时器。
就个人而言,我只是将进度条样式设置为“ Marquee”,以便用户知道程序正在忙于做某事,然后在单个后台工作程序上运行GetDeviceStats
函数。
实际上,您需要两个后台工作人员才能使用进度条来实现GUI。 您已经必须更新进度条。
第二个可以用来调用WebSwitchHandler.GetDeviceStats(NewRoom);
作为异步操作,以便您的UI线程不会被阻塞。 完成此BG工人的工作后,您可以通知第一个工人立即完成工作,而不必总是等待固定的时间。 这样,您还可以优化等待时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.