2012-11-08 20:22

BackgroundWorker

BackgroundWorker
常用属性
1.CancellationPending
指示应用程序是否已请求取消后台操作。
只读属性,默认为 false,当执行了 CancelAsync 方法后,值为 true。
2.WorkerSupportsCancellation
指示是否支持异步取消。要执行 CancelAsync 方法,需要先设置该属性为 true。
 
3.WorkerReportsProgress
指示是否能报告进度。要执行 ReportProgress 方法,需要先设置该属性为 true。
常用事件
1.DoWork
调用 RunWorkerAsync 方法时发生。
 
2.RunWorkerCompleted
后台操作已完成、被取消或引发异常时发生(操作完成时)。
3.ProgressChanged
调用 ReportProgress(bw.ReportProgress(value,state);) 方法时发生。
在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
例子:  
        #region 加载事件        
        private void Form1_Load(object sender, EventArgs e)
        {
            backgroundWorker1.WorkerReportsProgress = true;//是否在异步操作里报告进度
            backgroundWorker1.WorkerSupportsCancellation = true; //是否可以取消这个异步操作
        }
        #endregion

        //开始backgroundworker异步处理
        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync(20);//
        }

        int index = 0;
        //backgroundworker异步要调用的方法
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                BackgroundWorker bw = (BackgroundWorker)sender;
                int count = Convert.ToInt32(e.Argument);//count为20
                for (int i = 0; i < count; i++)
                {
                    if (bw.CancellationPending)//bw.CancellationPending最后一次调用BackgroundWorker的方法是RunWorkerAsync(falser)还是CancelAsync(true),
                    {
                        return;
                    }
                    index++;
                    Thread.Sleep(1000);
                    bw.ReportProgress(index, e.Cancel);
                }
                e.Result = "成功";
            }
            catch (Exception)
            {

            }
        }

        //backgroundworker异步处理返回的进度
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.label1.Text = e.ProgressPercentage.ToString();
        }

        //backgroundworker异步处理完成过后的事件
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //  MessageBox.Show(e.Error.Message);

            MessageBox.Show(e.Result.ToString());
        }
        //取消backgroundworker异步处理
        private void button2_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();
        }

添加新评论