0

我在后台工作人员中遇到进度条问题。

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 处理这个问题。

4

2 回答 2

1

问题是因为 UI 线程正在更新进度条。但是 UI 线程正在“忙”等待GetDeviceStats函数完成。所以它不能处理进度条更新,直到它再次变得空闲。

如果该GetDeviceStats函数是一个长时间运行的进程(对我来说就是这样),那么您最好在后台工作线程中包含该工作。但是,在呼叫再次完成之前,您仍然无法报告进度(因此更新进度条)。

一些可能的解决方案是在GetDeviceStats完成时报告进度(我不确定该功能实际上做了什么,所以这可能不是一个选项),或者如果您需要“伪造”进度然后使用第二个背景线程或计时器。

就个人而言,我只是将进度条样式设置为“Marquee”,以便用户知道程序正忙于做某事,然后GetDeviceStats在单个后台工作人员上运行该功能。

于 2013-07-29T13:03:01.737 回答
0

实际上,您需要两个后台工作人员来实现使用进度条为您工作的 GUI。您已经必须更新进度条。

第二个你可以用来调用WebSwitchHandler.GetDeviceStats(NewRoom);as async 操作,这样你的 UI 线程就不会被阻塞。完成此 BG 工作人员后,您可以通知第一个工作人员立即完成,而不是始终等待固定时间。这样您还可以优化等待时间。

于 2013-07-29T13:34:54.687 回答