天天看点

C#学习笔记之BackGroundWorder

C#学习笔记之BackGroundWorder
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BackGroundWorder组件控件
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        /// <summary>
        /// BackGroundWorker是.NET里用来执行多线程的控件,它允许程序员在单独的一个线程里
        /// 执行一些操作。耗时的操作(比如下载和数据库事务)在长时间运行时可能会导致用户界面
        /// 始终处于“未响应”状态。
        /// 
        /// 该控件有三个事件:DoWork、ProgressChanged、RunWorkerCompleted。
        /// 在程序中调用 RunWorkerAsync() 方法则会启动 DoWork 事件;当在事件处理过程中,调用
        /// ReportProgress() 方法则会启动 ProgressChanged 事件;而当 DoWork 事件处理完成时
        /// 则会触发 RunWorkerCompleted 事件。
        /// 
        /// 注意:如果在 DoWork 事件中操作任何用户界面对象,界面仍然会出现“未响应”;应该在事件
        /// ProgressChanged 和 RunWorkerCompleted 中和窗体进行通信。
        /// </summary>


        // 在程序中调用 RunWorkerAsync() 将会触发该事件:
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            // sender:表示触发该事件的控件对象
            // e 有三个属性:Cancel、Argument、Result

            // 1、Cancel:DoWork 事件中的代码应定期检查 CancellationPending 属性值,并在该值
            // 为 true 时终止操作,true表示应用程序已经请求取消后台操作,此时 Cancel 应设置
            // 为 true,同时 RunWorkerCompleted 事件处理程序中的Cancelled也变为 true。
            if (backgroundWorker1.CancellationPending == true)
            {
                e.Cancel = true;
                return;
            }

            // 2、Argument:触发 DoWork 事件的方法 RunWorkerAsync() 有两种重载,一种无参,
            // 另一种有一个object类型的参数;当调用有参方法时,e 的 Argument 属性将会指向
            // 这个参数。
            string str = e.Argument.ToString(); // 获取 RunWorkerAsync() 传递过来的值
            for (int i = 1; i <= 100; i++)
            {
                string strr = "第" + i + "句:" + str;

                // 触发 ProgressChanged 事件
                backgroundWorker1.ReportProgress(i, strr);

                if (i == 50)
                {
                    // 此方法只是请求取消,此处并没有取消。
                    backgroundWorker1.CancelAsync();
                    MessageBox.Show("请求取消后台操作!");

                    if (backgroundWorker1.CancellationPending == true)
                    {
                        e.Cancel = true;
                        MessageBox.Show("后台程序中断!");
                        return;
                    }
                }
                Thread.Sleep(200);
            }

            // 3、Result:此处将Result设置成什么,RunWorkerCompleted 事件中的Result就是什么。
            e.Result = "完美结束!";
        }

        // 在 DoWork 事件中调用 ReportProgress() 方法就会触发该事件。
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            // ReportProgress() 有两种重载:
            // void ReportProgress(int persentProgress);
            // void ReportProgress(int persentProgress, object userState);

            // ReportProgress() 的第一个参数一般用来报告该后台操作完成的进度,可以通过 
            // ProgressChanged 事件中 e 的 ProgressPersentage 属性来获取。如果还想传递
            // 更多的参数,可以使用参数 userState,可以通过事件 e 的 UserState属性来获取。

            progressBar1.Value = e.ProgressPercentage;
            label1.Text = e.UserState.ToString();
        }

        // 当 DoWork 事件处理程序结束之后将会触发此事件。
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show("后台程序出错:" + e.Error.Message.ToString());
            }
            else if (e.Cancelled)
            {
                MessageBox.Show("后台程序被终止!");
            }
            else
            {
                MessageBox.Show("后台程序运行结束!\r\n" + e.Result);
            }
        }

        // 启动后台程序
        private void button1_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy)
            {
                MessageBox.Show("后台程序正在执行!");
            }
            else
            {
                // 启动后台程序
                backgroundWorker1.RunWorkerAsync("Hello World");
            }

            backgroundWorker1.WorkerReportsProgress = true;        // 设置支持报告进度更新
            backgroundWorker1.WorkerSupportsCancellation = true;   // 设置支持取消后台操作    
        }
    }
}

           

继续阅读