background (visual studio 2008)



程式功能:按下開始按鈕,label會從0開始增加,按下停止則會停在當前數值

step1.
開啟visual studio 2008建立一個window Form專案,在此以backgroundPro為方案名稱
(檔案 >> 新增 >> 專案  >>專案類型選擇 visual C# >>範本選擇 Window Form 應用程式)



step2.
利用工具箱建立兩個button一個label與一個background
(檢視 >>工具箱)

step3.
將button1屬性中的Name改為Start,Text改為開始,button2的Name改為Stop,Text改為停止。
(此步驟可不做)


step4.
在background的事件中,DoWork與RunWorkerCompleted點兩下增加程式碼,按鈕Click點兩下增加(亦可在按鈕上點兩下便會增加Click事件)



至此會自動產生四個事件程式碼


step5.
在background開始執行前,將 WorkerSupportsCancellation設定為true,才可呼叫CancelAsync。
在DoWork事件中跑回圈並顯示於label、RunWorkerCompleted事件中顯示結束訊息、Start_Click開始執行背景程式、Stop_Click停止背景程式

範例程式碼
namespace backgroundPro
{
    public partial class Form1 : Form
    {
        int a;
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerSupportsCancellation = true;
            //將WorkerSupportsCancellation才可呼叫CancelAsync,否則會發生例外錯誤
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 0; i < 1000000; i++)
            {
                if (backgroundWorker1.CancellationPending) //若有選擇停止則會變為true
                {
                    e.Cancel = true;  //判斷是否該取消動作
                    break;
                }
                a = i;
                Invoke(new Action(show));   //使用委派方式顯示當前的數值
            }
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //背景作業跳出時會執行此
            MessageBox.Show("迴圈終止");
        }
        private void Start_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();//開始執行background
        }
        private void Stop_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();
        }

        private void show()
        {
            this.label1.Text = Convert.ToString(a);
           // 因為函式只能輸入方法名稱,故寫一方法為顯示數值。 (Invoke(new Action(方法名稱));) 
        }
    }
}


step6.
顯示結果


其中e.cancel >> 如果RunWorkerCompletedEventArgs.Cancelled為True則結束 ,RunWorkerCompletedEventArgs.Cancelled為False則繼續 。

可能會有人有疑問為何在RunWorkerCompleted事件中不是直接檢查BackgroundWorker的CancellationPending屬性值,原因在於當DoWork事件執行完畢進入RunWorkerCompleted事件後,BackgroundWorker的CancellationPending屬性值將會恢復為False。

        在DoWork區塊中 e,Cancel=True並不會讓BackgroundWorker停掉(因此我們必須自行撰寫跳離的程序),事實上這個動作是當離開DoWork到達RunWorkerCompleted的時候會將這個值傳遞過去,這樣就可以在RunWorkerCompleted以e.Cancelled的值來判斷我們是要再次呼叫與否.
這件事情很多書也沒說明清楚,很容易讓人誤以為只要e.Cancel=true就會自動停掉,實際上這只是傳遞一個值,它並不會自己停掉


此部分用的方法名、事件、屬性名稱與引發的功能
RunWorkerAsync()                  啟動執行背景作業。
CancelAsync                          要求取消暫止的背景作業。
RunWorkerAsync(Object)  啟動執行背景作業,並加入背景作業所要使用的參數。
CancellationPending                  取得值,指出應用程式是否已經要求取消背景作業。
WorkerSupportsCancellation  取得或設定值,指出 BackgroundWorker 是否支援非同步取消。


DoWork                                  當呼叫 RunWorkerAsync 時發生。
RunWorkerCompleted          當背景作業已完成、取消或引發例外狀況時發生。

留言

這個網誌中的熱門文章

SQL SEVER備份與還原遭遇問題

asp.net頁面間傳值