后台线程 BackgroundWorker

当我们需要另建一个线程,在后台持续运行以完成某项工作,并不时的与主线程进行通信的时候,就用BackgroundWorker

 public partial class Form1 : Form

    {
        BackgroundWorker bw = new BackgroundWorker();
        public Form1()
        {
            InitializeComponent();
            //设置BackgroundWorker属性
            bw.WorkerReportsProgress = true;
            bw.WorkerSupportsCancellation = true;
            //连接BackgroundWorker对象处理程序
            bw.DoWork += DoWork_Handle;
            bw.ProgressChanged += ProgressChanged_Handler;
            bw.RunWorkerCompleted += RunWorkCompleted_Handler;
            //执行顺序
            //1. bw.DoWork
            //2. bw.ProgressChanged
            //3. bw.RunWorkerCompleted
        }
        private void RunWorkCompleted_Handler(object sender, RunWorkerCompletedEventArgs e)
        {
            
            //在主线程里面执行
            Console.WriteLine("RunWorkCompleted_Handler______" + Thread.CurrentThread.ManagedThreadId.ToString());
            MessageBox.Show("RunWorkCompleted_Handler");
            progressBar1.Value = 0;
            if (e.Cancelled)
            {
                MessageBox.Show("Process was cancelled.", "Process Cancelled");
            }
            else
            {
                MessageBox.Show("Process compeleted normally.", "Process Completed");
            }
        }
        private void ProgressChanged_Handler(object sender, ProgressChangedEventArgs e)
        {
            //在主线程里面执行
            Console.WriteLine("ProgressChanged_Handler______" + Thread.CurrentThread.ManagedThreadId.ToString());
            //MessageBox.Show("ProgressChanged_Handler");
            progressBar1.Value = e.ProgressPercentage;


            //通过 e.UserState 传递对象参数
            Type s = e.UserState.GetType();
            
            PropertyInfo pName = s.GetProperty("Name");
            PropertyInfo pAge = s.GetProperty("Age");


            dynamic p = e.UserState;
            Console.WriteLine(p.Name);
            Console.WriteLine(p.Age);


            
        }
        private void DoWork_Handle(object sender, DoWorkEventArgs e)
        {
            //在子线程里面执行
            Console.WriteLine("DoWork_Handle______" + Thread.CurrentThread.ManagedThreadId.ToString());
            MessageBox.Show("DoWork_Handle");
            BackgroundWorker worker = sender as BackgroundWorker;
            for (int i = 0; i <= 10; i++)
            {
                //是否取消后台操作
                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    //调用ProgressChanged_Handler
                    var aa = new { Name = "张三", Age = 50 };
                    worker.ReportProgress(i * 10, aa);
                    
                    Thread.Sleep(500);
                }
            }


        }
        private void proccessBtn_Click(object sender, EventArgs e)
        {
            Console.WriteLine("proccessBtn_Click______" + Thread.CurrentThread.ManagedThreadId.ToString());
            //触发
            if (!bw.IsBusy)
            {
                bw.RunWorkerAsync();
            }
        }
        private void cancelBtn_Click(object sender, EventArgs e)
        {
            //关闭异步
            bw.CancelAsync();


        }
    }

猜你喜欢

转载自blog.csdn.net/LUOCHENLONG/article/details/80251319