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

来源:互联网 发布:saas企业软件市场规模 编辑:程序博客网 时间:2024/05/21 19:39
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;        }












原创粉丝点击