我正面临着后台工作人员进度条的问题。
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处理这个问题。
答案 0 :(得分:1)
问题是因为UI线程正在更新进度条。但是UI线程“忙”等待GetDeviceStats
函数完成。所以它再也无法处理进度条更新。
如果GetDeviceStats
函数是一个长时间运行的过程(对我而言),那么最好在后台工作线程中包含该工作。但是,在呼叫再次结束之前,您仍然无法报告进度(因此更新进度条)。
一些可能的解决方案是在完成时GetDeviceStats
报告进度(我不确定该功能实际上做了什么,所以这可能不是一个选项),或者如果你需要“假的” “然后进度使用第二个后台线程或计时器。
就个人而言,我只是将进度条样式设置为“Marquee”,以便用户知道程序正忙着做某事,然后在单个后台工作程序上运行GetDeviceStats
函数。
答案 1 :(得分:0)
实际上,您需要两个后台工作人员才能通过进度条实现为您工作的GUI。您必须更新进度条。
您可以使用第二个作为异步操作调用WebSwitchHandler.GetDeviceStats(NewRoom);
,以便不阻止您的UI线程。完成此BG工作人员后,您可以立即通知第一个工作人员,而不是等待固定时间。这样您还可以优化您的等待时间。