簡體   English   中英

在后台工作人員中使用進度欄

[英]using progress bar in background worker

我有2個表單,第二個表單中有進度條。 當我單擊主窗體上的按鈕時,將打開帶有進度欄的Form2:

private void button1_Click(object sender, EventArgs e)
{
    this.ShowInTaskbar = false;
    this.Visible = false;
    bw.RunWorkerAsync();
    //Show Form2 with progress bar
    Show_pb();
}
Form2 f_pb = new Form2();

Show_pb()
{
    f_pb.ShowDialog();
    f_pb.Activate();
}

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    //... hard work...
}

之后,在bw_RunWorkerCompleted我將數據填充到Form1中的某些控件中:

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //...updating DataGridView and TreeView...
}

不幸的是,當bw_RunWorkerCompleted工作時, 跑馬燈進度欄將凍結,並且看起來該應用程序已掛起。

我能做什么?

使用ShowDialog顯示進度對話框會阻塞UI線程,因此無法更新進度。 出於同樣的原因,后台工作人員完成后,UI上的代碼更新工作無法執行。

要走的路是:

  1. 實現后台工作程序的progress事件,並讓后台工作人員在此事件中報告進度(這將在UI線程的上下文中調用,因此您不必擔心跨線程問題)
  2. 將進度設置為“對話”,這是一個普通的窗口,該窗口最頂部且看起來像一個對話框(您可能需要實現其他功能,以確保不能將其禁用並禁用主窗口,因為它將繼續響應)。
  3. 在進度事件處理程序中,在輔助窗口中更新進度狀態。

您現在在評論中說,進度欄實際上是一個選取框,未顯示任何實際進度。 解決方案並不重要-只是不進行進度更新。

問題是ShowDialog阻塞UI線程,直到對話框關閉為止,而這是您無法從代碼中完成的。 使其成為非模態對話框,您應該可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM