我想在WinForms C#應用程序中有一個單獨的線程啓動一個控制ProgressBar(字幕)的後臺工作。問題是,當我嘗試將欄設置爲可見時,它什麼都不做,我嘗試了很多形式的調用,但他們似乎沒有幫助。從另一個線程操縱UI元素
以下方法progressBarCycle
從一個單獨的線程調用。
BackgroundWorker backgroundWorker = new BackgroundWorker();
public void progressBarCycle(int duration)
{
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.RunWorkerAsync(duration);
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
worker.ReportProgress(0);
DateTime end = DateTime.Now.AddMilliseconds((int)e.Argument);
while (DateTime.Now <= end)
{
System.Threading.Thread.Sleep(1000);
}
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!this.IsHandleCreated)
this.CreateHandle();
statusStrip1.Invoke((MethodInvoker)delegate
{
progressBar1.Visible = false;
});
// if (!this.IsHandleCreated)
// {
// this.CreateHandle();
// if (InvokeRequired) this.Invoke((MethodInvoker)(() => progressBar1.Visible = false));
// else progressBar1.Visible = false;
// }
// else
// if (InvokeRequired) this.Invoke((MethodInvoker)(() => progressBar1.Visible = false));
// else progressBar1.Visible = false;
}
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (!this.IsHandleCreated)
this.CreateHandle();
statusStrip1.Invoke((MethodInvoker)delegate
{
progressBar1.Visible = true;
});
// if (!this.IsHandleCreated)
// {
// this.CreateHandle();
// if (InvokeRequired) this.Invoke((MethodInvoker)(() => progressBar1.Visible = true));
// else progressBar1.Visible = true;
// }
// else
// if (InvokeRequired) this.Invoke((MethodInvoker)(() => progressBar1.Visible = true));
// else progressBar1.Visible = true;
}
我在這裏錯過了一些明顯的東西嗎?評論部分是我嘗試過的其他事情。
我放入ProgressChanged和RunWorkerCompleted純粹是爲了看看它是否會解決我的問題。當我把所有的代碼都包含在DoWork中時,它會做同樣的事情。Visible的狀態永遠不會改變,無論有沒有調用。 - 哦,可能值得一提的是,這是一個字幕,所以我不打算使用進度報告。 – UncleDave
@UncleDave然後它聽起來像進度條是在另一個控件(面板也許),是不可見的。 –
進度條位於運行此代碼的窗體上,該窗體也是應用程序的開始窗體。 – UncleDave