C#后台线程及UI线程交互可以采用BackgroundWorker

BackgroundWorker是·net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。耗时的操作(如下载和数据库事务)
在长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,
则可以使用BackgroundWorker类方便地解决问题。

BackgroundWorker支持后台与UI线程的交互。使用ProgressChanged配合worker.ReportProgress(100)汇报进度;

                        using (BackgroundWorker bw = new BackgroundWorker())
                        {
                            bw.ProgressChanged += new ProgressChangedEventHandler(Bw_ProgressChanged);//创建变更事件
                            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Bw_RunWorkerCompleted);//创建完成事件
                            bw.WorkerReportsProgress = true;//打开进度报告更新
                            bw.DoWork += new DoWorkEventHandler(bw_DoWork);//委托事件
                            bw.RunWorkerAsync(fileinfo1.FullName);//开始执行
                        }



在后台中添加ReportProgress()来激活Bw_ProgressChanged()与UI线程做交互。

 	public async void EditXlsx(DataSet data, BackgroundWorker worker)
	{
		worker.ReportProgress((i * 100 / data.Tables[0].Rows.Count));
	}


	void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            EditXlsx(ToDataTable(e.Argument.ToString()), (BackgroundWorker)sender);
        }

        private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //System.Diagnostics.Process.Start("explorer.exe", FileName + "Result" + "\\");
            this.probar.Value = 100;
            MessageBox.Show("转制完成");
        }

        private void Bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            probar.Value = e.ProgressPercentage;
        }












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值