关于net2.0里面新出现的类backgroundworker的应用

本文介绍.NET 2.0中的BackgroundWorker类,该类简化了后台任务处理及与UI交互的过程。文章详细解释了如何使用BackgroundWorker执行长时间任务并实时更新UI状态,避免界面失去响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一个在.net2.0里面新出现的类,用于执行后台比较长的任务而又想能和UI有点操作的应用里面。
普通情况下,你点击一个按钮,去后台执行一个process,如果你想得到结果,就得等这个process结束。通常,可以使用异步执行回调来解决这个问题。现在,backgroundworker给我们实现了这样一种简单的封装,可以把我们的复杂任务交给新的线程去处理,然后继续UI线程。等到我们的任务需要通知UI做什么事情的时候,可以report一下,在其事件里就可以直接使用UI控件,而不需要Control.Invoke去掉用之。
 
有这样一个应用:客户需要把大量数据(需要执行3天)copy到另外一个机器,中间想能看到有多少数据被复制/失败等(实时报道)。
 
在这个例子里面,我们的界面可能非常简单:一个开始按钮,一个结束按钮,一个richtextBox来显示运行记录。但是后台执行可能就会比较棘手。如果简单的执行,并且报告,那么整个界面将失去响应(都在同一个线程里面,造成忙碌)。这时候,可以使用这个backgroundworker了。它可以在后台执行,并且报告给界面实时信息,界面不会失去响应。
 
   先介绍一下backgroundworker的几个属性/方法
   .WorkerReportsProgress:是否可以向外报告进度。
   .WorkerSupportsCancellation :是否可以暂停任务
   . CancellationPending: 是否正在暂停中
   . RunWorkerAsync() : 开始执行任务。触发DoWork事件
   . ReportProgress(int percentPrgress,object userState) : 向外报告进度。触发ProgressChanged事件.其中,参数可以在ProgressChangedEventArgs(worker_ProgressChanged(object sender, ProgressChangedEventArgs e))中得到
   . CancelAsync() :取消(暂停)执行。
   事件
    worker.DoWork += new DoWorkEventHandler(worker_DoWork);//执行任务
 worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);//任务结束时
   worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged)//报告状态
 
   按照上边的资料,我们这个应用就可以这样处理之
   formDisplay是用于显示实时状态的窗口。有DisplyMessage方法来显示信息到界面
   在Hanlder类(处理文件copy的)里面:
       static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //show the message on windows
           formDisplay.DisplyMessage(copy, e.UserState.ToString());//show message.
        }
 
        static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
             string msg = "JOB copy : have been completed";
             formDisplay.DisplyMessage(msg);//show message
        }
         
        static void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            for()
            {
                 //copying
                (sender as BackgroundWorker). ReportProgress(0,xxx complete);//report
}
        }
这样构造的程序里面,才不会出现UI失去响应。
 
当然,通过写自己的异步处理也可以实现,功能更强大。只不过这个用起来更简单。
至于backgroundworker是怎么实现的呢?这里有人已经做出了一些解答:
http://blog.joycode.com/sunmast/archive/2006/03/02/about_system_componentmodel_asyncoperation.aspx
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值