C# BackgroundWorker組件學習

      

 

     C# BackgroundWorker組件學習html

 

       一個程序中須要進行大量的運算,而且須要在運算過程當中支持用戶必定的交互,爲了得到更好的用戶體驗,使用BackgroundWorker來完成這一功能.     數據庫

 

        BackgroundWorker類容許您在單獨的專用線程上運行操做。  耗時的操做(以下載和數據庫事務)在長時間運行時可能會致使用戶界面 (UI) 彷佛處於中止響應狀態。編程

  若是您須要能進行響應的用戶界面,並且面臨與這類操做相關的長時間延遲,則可使用 BackgroundWorker類方便地解決問題(MSDN)。 app

 

        若要在後臺執行耗時的操做,請建立一個 BackgroundWorker,偵聽那些報告操做進度並在操做完成時發出信號的事件。  能夠經過編程方式建立 BackgroundWorker異步

  也能夠將它從「工具箱」「組件」選項卡中拖到窗體上。  若是在 Windows 窗體設計器中建立 BackgroundWorker,則它會出如今組件欄中,並且它的屬性會顯示在「屬性」窗async

  口中(MSDN)。ide

 

  屬性:工具

 

   IsBusy:獲取一個值,指示 BackgroundWorker 是否正在運行異步操做。學習

   WorkerReportsProgress: 獲取或設置一個值,該值指示 BackgroundWorker 可否報告進度更新。ui

   WorkerSupportsCancellation: 獲取或設置一個值,該值指示 BackgroundWorker 是否支持異步取消。

 

   事件:

 

   DoWork: 調用 RunWorkerAsync 時發生。

   ProgressChanged: 調用 ReportProgress 時發生。

   RunWorkerCompleted: 當後臺操做已完成、被取消或引起異常時發生。

 

   實例:

 

   窗體設計以下圖:

 

 

 

   代碼實現:

  

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            for (int i = 1; i <= 12; i++)
            {
                if (worker.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    System.Threading.Thread.Sleep(500);
                    worker.ReportProgress(i * 10);
                }
            }
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            lbResult.Text = (e.ProgressPercentage.ToString() + "%"+e.UserState);
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                lbResult.Text = "Canceled!";
            }
            else if (e.Error != null)
            {
                lbResult.Text = "Error: " + e.Error.Message;
            }
            else
            {
                lbResult.Text = "Done!";
            }
        }

        private void btnStartAsync_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy != true)
            {
                backgroundWorker1.RunWorkerAsync();
            }
        }

        private void btnCancelAsync_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                backgroundWorker1.CancelAsync();
            }
        }
    }
}

 

 

 

   運行結果:

 

 

相關文章
相關標籤/搜索