繁体   English   中英

后台工作程序+套接字中的C#进度栏-进度栏仅在套接字通讯完成后才更新

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM