C# BackgroundWorker 和progressBar实现显示后台线程的进度

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.backgroundWorker1.WorkerReportsProgress = true;//指示BackgroundWorker是否可以报告进度更新。当该属性值为True是,将可以成功调用ReportProgress方法,否则将引发InvalidOperationException异常。 
            this.backgroundWorker1.DoWork += backgroundWorker1_DoWork;
            this.backgroundWorker1.ProgressChanged += BackgroundWorker1_ProgressChanged;
            this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.BackgroundWorker1_RunWorkerCompleted);
        }

        /// <summary>
        /// 这里是后台工作完成后的消息处理(异步操作完成或中途终止会触发该事件)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("运算完成了");
        }

        /// <summary>
        /// 这里就是通过响应消息,来处理界面的显示工作(当调用ReportProgress方法时发生)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;
            this.label1.Text = e.UserState.ToString();
            this.label1.Update();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            this.backgroundWorker1.RunWorkerAsync();
            this.button1.Enabled = false;

        }

        /// <summary>
        /// 后台进程开始工作的地方,当执行backgroundworker.RunWorkerAsync方法时会触发该事件。
        /// 并且传递DoWorkEventArgs参数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            Work(this.backgroundWorker1);//调用处理函数,也可以直接将处理写在这个方法里
        }

        /// <summary>
        /// 处理函数
        /// </summary>
        /// <param name="bk"></param>
        /// <returns></returns>
        private bool Work(BackgroundWorker bk)
        {
            for (int i = 0; i < 100; i++)
            {
                //这里判断一下,是否用户要求取消后台进程,并可以尽早退出
                //可以通过调用cancelAsync方法设置CancelationPending的值为false
                if (bk.CancellationPending)
                {
                    bk.ReportProgress(i, string.Format("{0}% ,操作被用户申请中断",i));
                    return false;
                }
                //调用ReportProgress方法,会触发ProgressChanged事件
                bk.ReportProgress(i, string.Format("{0}%", i));
                System.Threading.Thread.Sleep(1000);
            }
            return true;
        }
    }
}

 

posted @ 2018-03-15 10:40  记忆留樱  阅读(1002)  评论(0)    收藏  举报