C#之--多线程控件BackgroundWorker

C#多线程BackgroundWorker

用C#开发应用程序,常会遇到读写大量文件的情况,比如批量操作Excel。为保证主界面的响应,需要开启新线程,在线程中进行耗时操作。不过.net为我们封装好了一个多线程控件BackgroundWorker,调用该类可以轻松完成耗时操作,并在主界面中以进度条等方面显示处理进度。

根据MSDN的说明,使用BackgroundWorker需要注册以下几个事件
这里写图片描述

然后调用RunWorkerAsync()方法开始执行后台操作。

public partial class FormReview : Form
    {
        public FormReview()
        {
            InitializeComponent();
        }
        //实例化一个BackgroundWorker
        BackgroundWorker bgw = new BackgroundWorker();
        ToolStripProgressBar progressBar = new ToolStripProgressBar();
		Report report = new Report();
        private void FormReview_Load(object sender, EventArgs e)
        {
            bgw.DoWork += new DoWorkEventHandler(ReportDoWork);
            bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
            bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ReportCompleted);
            //反馈进度
            bgw.WorkerReportsProgress = true;
			
            progressBar.Maximum = 100;
            progressBar.Visible = false
			statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.progressBar});
			
			report.Bgw = bgw;
			progressBar.Visible = true;
			bgw.RunWorkerAsync();
		}
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ReportDoWork(object sender, DoWorkEventArgs e)
        {
            report.WriteReport();
        }

        private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
	        //progressBar的最大值设置为100,进度以百分比显示
            progressBar.Value = e.ProgressPercentage;
        }

        private void ReportCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            progressBar.Visible = false;
            bgw.ProgressChanged -= bgw_ProgressChanged);
            bgw.DoWork -= ReportDoWork;
            bgw.RunWorkerCompleted -= ReportCompleted;
        }
}

定义Report类,文件耗时操作放在这里

public class Report
    {
        BackgroundWorker bgw = new BackgroundWorker();
        public BackgroundWorker Bgw
        {
            get { return bgw; }
            set { bgw = value; }
        }

        /// <summary>
        /// 
        /// </summary>
        public void WriteReport()
        {
	        //批量操作,比如有200个文件
            for (int i = 0,len = 200; i < len; i++)
            {
	            //耗时操作放在这里,具体内容省了
	            //......
	            //向主线程报告处理进度,百分比
                bgw.ReportProgress((i + 1) * 100/len);
            }
        }

    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值