[英]C# windows form progress bar with a function on background worker
我正在嘗試在我的c#excel add in中添加進度條(MARQUEE樣式)。進度條出現但在功能執行完畢之前它並不表示任何進度,這意味着它仍然處於凍結狀態。
這些是Windows窗體類中的函數:
public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
//run in back thread
backgroundWorker1.ReportProgress(i);
}
}
//call back method
public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
//call back method
public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Value = progressBar1.Maximum;
}
這是我從添加按鈕調用該函數的方法:
private void buttonClicked(object sender, RibbonControlEventArgs e)
{
AddInPlanView.Form1 pBar = new AddInPlanView.Form1();
pBar.Visible = true;
pBar.backgroundWorker1.WorkerReportsProgress = true;
pBar.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(pBar.backgroundWorker1_ProgressChanged);
pBar.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(pBar.backgroundWorker1_DoWork);
pBar.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(pBar.backgroundWorker1_RunWorkerCompleted);
pBar.backgroundWorker1.RunWorkerAsync();
FUNCTIONTORUN();
pBar.Visible = false;
}
我的代碼現在嘗試將進度條放在后台工作者上。 我知道我應該切換這個,以便FUNCTIONTORUN()
應該是后台工作者,但我該怎么做呢? 由於它是一個選取框進度條,我根本不需要更新進度條的值,它只需要運行直到FUNCTIONTORUN()
結束。 請注意, FUNCTIONTORUN()
更新Excel工作表的單元格。
使用Visual Studio設計器初始化進度條。 表單類中ProgressBar
對象的名稱是progressbar1
。
要啟動選框樣式進度條,請鍵入
progressbar1.Style = ProgressBarStyle.Marquee;
progressbar1.MarqueeAnimationSpeed = 100;
停止選框類型
progressbar1.MarqueeAnimationSpeed= 0;
資料來源: http : //social.msdn.microsoft.com/forums/en-US/winforms/thread/9e51ad57-988e-4c17-98f0-cd2a8abec503/
FUNCTIONTORUN(); // make your UI thread busy.
System.Windows.Forms.Application.DoEvents(); // might help in this case.
在大多數情況下,DoEvent沒有幫助(根據我的經驗)。 因此,讓流程欄順利運行是非常困難的。
當后台工作程序完成時,只需停止進度條。
在此函數內部, pBar.backgroundWorker1_RunWorkerCompleted
只需調用進度條的Stop函數。
你的FUNCTIONTORUN()
阻止了UI線程。
在長時間運行的函數中傳播一些System.Windows.Forms.Application.DoEvents()
來處理事件(因此UI更新)。
如上所述,這將更新UI並讓應用程序響應其他事件。
您可能希望禁用觸發此長時間運行功能的按鈕或其他長時間運行的功能。
我相信你必須將FUNCTIONTORUN()置於sepratae線程中,並且仍然執行調用ReportProgress方法,以便提升backgroundWorker1_ProgressChanged
,你可以更新你的porgress bar值。 我想,因為我沒有在提供的代碼中看到它,所以不要在代碼中的某處調用ReportProgress
函數。
編輯 :看到ReportProgress
功能。
因此,將您的函數移動到單獨的線程中,並將進度條的值更新為主線程。
希望這可以幫助。
問候。
您可以使用DoWork創建一個額外的后台工作程序,其中包含對其內部的FUNCTIONTORUN()的調用,以及一個使您的欄停止或不可見的RunWorkerCompleted。 然后,不要調用FUNCTIONTORUN(),而是調用backGroundWorker2.RunWorkerAsync();
這應該可以防止該功能凍結您的UI。 去年夏天我遇到了這個問題幾乎完全相同的事情,並使用backgroundworkers修復它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.