簡體   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