跳到主要內容

Backgroundworker / delegate / Application.DoEvent

private BackgroundWorker backgroundWorker5;
        private delegate void delegateShowResultController(Label lbl, int setValue);

        public BackgroundWorkerT()
        {
            InitializeComponent();

            backgroundWorker5 = new BackgroundWorker();
            backgroundWorker5.WorkerReportsProgress = true;
            backgroundWorker5.WorkerSupportsCancellation = true;
            backgroundWorker5.DoWork += new DoWorkEventHandler(backgroundWorker5_DoWork);
            backgroundWorker5.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker5_ProgressChanged);
            backgroundWorker5.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker5_RunWorkerCompleted);
        }           


        private void backgroundWorker5_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw = sender as BackgroundWorker;
            string arg = (string)e.Argument;    //接收帶入的參數
            label1.Text = arg;

            e.Result = ExeJob(bw,e);    //真正執行要做的動作         

            if (bw.CancellationPending)
            {
                e.Cancel = true;
            }   
               
        }


        private int ExeJob(BackgroundWorker bw,DoWorkEventArgs e)
        {
            int result = 0;
            int exeTimes = 2000000;

            for (int i = 0; i < exeTimes; i++)
            {
                int precent = ((i + 1) * 100) / exeTimes;
                result = precent;
                backgroundWorker5.ReportProgress(precent);                           

                if (bw.CancellationPending)
                {
                    e.Cancel = true;   //Form1 觸發中斷執行
                    break;
                }             
            }

            return result;
        }                   


        private void backgroundWorker5_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;         
        }

        private void backgroundWorker5_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                MessageBox.Show("作業已取消");
            }
            else if (e.Error != null)
            {
                string msg = String.Format("發生錯誤 {0}", e.Error.Message);
                MessageBox.Show(msg);
            }
            else
            {
                string msg = String.Format("執行結果 = {0}", e.Result);             
                MessageBox.Show(msg);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (backgroundWorker5.IsBusy != true)
            {
                this.backgroundWorker5.RunWorkerAsync("PROCESS1");
            }         
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.backgroundWorker5.CancelAsync();
        }


        private void button3_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 3000; i++)
            {
                //label1.Text = "Processing: " + i.ToString();
                //System.Threading.Thread.Sleep(1000);
                //Application.DoEvents();

                object[] viewParams = new object[2];
                viewParams[0] = label1;
                viewParams[1] = i;
                this.BeginInvoke(new delegateShowResultController(ShowResultView), viewParams);
            }
            label1.Text = "Finish";
        }

        private void ShowResultView(Label lbl, int setValue)
        {
            lbl.Text = setValue.ToString();
            this.Refresh();
        }