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
    评论
在使用BackgroundWorker开启多线程时,需要先创建一个BackgroundWorker对象,然后设置DoWork事件处理程序。接着在主线程中调用BackgroundWorker的RunWorkerAsync方法,该方法将启动一个新线程并执行DoWork事件处理程序。可以通过设置BackgroundWorkerWorkerReportsProgress和WorkerSupportsCancellation属性,使其支持进度报告和取消操作。 以下是一个简单的示例代码,演示如何使用BackgroundWorker开启多线程: ```c# private BackgroundWorker worker; private void buttonStart_Click(object sender, EventArgs e) { // 创建BackgroundWorker对象 worker = new BackgroundWorker(); // 设置DoWork事件处理程序 worker.DoWork += new DoWorkEventHandler(worker_DoWork); // 设置支持进度报告和取消操作 worker.WorkerReportsProgress = true; worker.WorkerSupportsCancellation = true; // 启动新线程 worker.RunWorkerAsync(); } private void worker_DoWork(object sender, DoWorkEventArgs e) { // 执行耗时操作 for (int i = 1; i <= 100; i++) { // 发送进度报告 worker.ReportProgress(i); // 检查是否取消操作 if (worker.CancellationPending) { e.Cancel = true; return; } // 模拟耗时操作 Thread.Sleep(50); } } private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { // 更新进度条 progressBar1.Value = e.ProgressPercentage; } private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { // 检查是否取消操作 if (e.Cancelled) { MessageBox.Show("操作已取消"); } else if (e.Error != null) { MessageBox.Show("发生错误:" + e.Error.Message); } else { MessageBox.Show("操作已完成"); } } ``` 在上述代码中,buttonStart_Click事件处理程序中创建了一个BackgroundWorker对象,并设置DoWork事件处理程序、支持进度报告和取消操作。然后调用RunWorkerAsync方法启动新线程。在worker_DoWork事件处理程序中执行耗时操作,并发送进度报告。在worker_ProgressChanged事件处理程序中更新进度条。在worker_RunWorkerCompleted事件处理程序中检查是否取消操作或发生错误,并显示相应的消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值