![](/img/trans.png)
[英]wpf c# progress bar wont update untill after work is done when in background worker
[英]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.