后台運行之BackgroundWorker


BackgroundWorker 類允許您在單獨的專用線程上運行操作。 耗時的操作(如下載和數據庫事務)在長時間運行時可能會導致用戶界面 (UI) 似乎處於停止響應狀態。 如果您需要能進行響應的用戶界面,而且面臨與這類操作相關的長時間延遲,則可以使用 BackgroundWorker 類方便地解決問題。

 

一、BackgroundWorker 相關生命周期

   1.聲明BackgroundWorker  

   2.設置相關操作事件和屬性,並開始這個對象

   3.執行設置事件(DoWork事件為耗時操作,耗時操作時反饋給UI界面的ProgressChanged事件(Dowork的報告方法引發),

      完成DoWork時執行RunWorkerCompleted方法)

   4.寫相關事件

 

比如導出excel

1.點擊時事件

       /// <summary>
        /// 將數據庫數據轉換為excel操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DbToExcel(object sender, RoutedEventArgs e)
        {

            BackgroundWorker bw = new BackgroundWorker();   //創建一個BackgroundWorker線程
            bw.WorkerReportsProgress = true;                //設置BackgroundWorker可以進行報告更新
            bw.DoWork += new DoWorkEventHandler(toExcel);  //執行耗時操作 創建一個DoWork事件,並進行報告,指定bw_DoWork方法去做事
            bw.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); //通過報告(數據),進行對UI操作
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); //完成操作時響應事件
            PartPosition = null;
            bw.RunWorkerAsync("my url");//開始執行DoWork事件 並傳遞一個對象
        }
View Code

2.BackgroundWorker 需要執行的事件

       void toExcel(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw = (BackgroundWorker)sender;
            string url = e.Argument.ToString();
         

                DataTable tableData = ProductMananger.getAllPositionList();           
                

                #region 插入數據
             
    
               
                foreach (DataRow row in tableData.Rows)
                {
                    //沒有取消后台操作
                    if (!bw.CancellationPending)
                    {
                       //報告  
                       bw.ReportProgress((int)((double)(rowIndex - 1) / RowCount * 100), i);
                    }
                }
           
             
            }
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //progressBar1.Value = e.ProgressPercentage;
            //label1.Text = e.UserState.ToString();  這個是一個對象
            this.progressText.Text = e.ProgressPercentage+"%";
            this.progressbar_Excel.Value = e.ProgressPercentage;
        }
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("ok!");
        }
View Code

 

如果不這樣可以如下:

Dispatcher.Invoke(new Action(() =>
            {
                this.progressText.Text = (int)(Value / Maximum * 100) + "%";
                this.progressbar_Excel.Value = Value;
            }));

 

 參考

http://www.cnblogs.com/zhouzangood/articles/3638117.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM