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

时间:2013-07-29 13:00:08

标签: c# sockets backgroundworker

我正面临着后台工作人员进度条的问题。

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

2 个答案:

答案 0 :(得分:1)

问题是因为UI线程正在更新进度条。但是UI线程“忙”等待GetDeviceStats函数完成。所以它再也无法处理进度条更新。

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

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

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

答案 1 :(得分:0)

实际上,您需要两个后台工作人员才能通过进度条实现为您工作的GUI。您必须更新进度条。

您可以使用第二个作为异步操作调用WebSwitchHandler.GetDeviceStats(NewRoom);,以便不阻止您的UI线程。完成此BG工作人员后,您可以立即通知第一个工作人员,而不是等待固定时间。这样您还可以优化您的等待时间。