zoukankan      html  css  js  c++  java
  • (转) BackgroundWorker

    这是一个在.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失去响应。

     

    当然,通过写自己的异步处理也可以实现,功能更强大。只不过这个用起来更简单。

  • 相关阅读:
    Android——继续深造——从安装Android Studio 2.0开始(详)
    PHP——安装wampserver丢失MSVCR110.dll
    Marza Gift for GDC 2016
    Retrieve OpenGL Context from Qt 5.5 on OSX
    Space Time Varying Color Palette
    Screen Space Depth Varying Glow based on Heat Diffusion
    Visualization of Detail Point Set by Local Algebraic Sphere Fitting
    Glass Dragon
    Jump Flood Algorithms for Centroidal Voronoi Tessellation
    京都之行
  • 原文地址:https://www.cnblogs.com/timy/p/1424093.html
Copyright © 2011-2022 走看看