zoukankan      html  css  js  c++  java
  • C#基础知识回顾--BackgroundWorker介绍

    简介

    BackgroundWorker是.net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题。
    该控件有三个事件:
    DoWork 、ProgressChanged 和 RunWorkerCompleted
    在程序中调用RunWorkerAsync方法则会启动DoWork事件的事件处理,当在事件处理过程中,调用 ReportProgress方法则会启动ProgressChanged事件的事件处理,而当DoWork事件处理完成时,则会触发RunWorkerCompleted事件。
    您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged和 RunWorkerCompleted 事件与用户界面进行通信。

    三个事件

    DoWork 事件

     
    void backgroundWorker1_DoWork( Object sender, DoWorkEventArgs e )
    其中句柄sender指向的就是该BackgroundWorker控件。
    第二个参数e有三个属性,Argument,Cancel和Result。
     
    Argument:
    大家应该还记得如何触发DoWork事件吧?对了,就是在程序中调用RunWorkerAsync方法,RunWorkerAsync方法有两种重载,第一种是无参形式,第二种是有一个指向Object^类型的参数,如果你调用的是有参类型的RunWorkerAsync,则DoWork事件处理程序的第二个参数e的Argment属性将会返回一个指向你传递过来的这个参数。
     
    Cancel:
    DoWork 事件处理程序中的代码应定期检查 CancellationPending属性值,并在该值为true时中止操作。出现这种情况时,可以将 System.ComponentModel.DoWorkEventArgs 的 Cancel标志设置为true,同时将 RunWorkerCompleted 事件处理程序中的 System.ComponentModel.RunWorkerCompletedEventArgs的 Cancelled 标志设置为true
     
    Result:
    等下面讲到RunWorkerCompleted事件时再细说。

    RunWorkerCompleted事件

    当DoWork事件处理完成之后,将会触发该事件。
    void backgroundWorker1_RunWorkerCompleted( Object sender, RunWorkerCompletedEventArgs e )
    现在主要讲第二个参数e,最重要的属性是Result。
    在DoWork事件中,你将Result设置成什么,这里的Result就返回什么。

    ProgressChanged事件

    在DoWork事件的处理过程中,如果调用ReportProgress则会发生该事件。
    void backgroundWorker1_ProgressChanged( Object sender, ProgressChangedEventArgs e )
    先来说说ReportProgress的两种重载:
    void ReportProgress(int percentProgress)
    void ReportProgress(int percentProgress,Object userState)
    ProgressChanged事件处理程序的第二个参数e有一个ProgressPercentage属性,它就由ReportProgress的第一个参数percentProgress来提供。这个参数一般用来报告该后台操作完成的进度,然后用ProgressChanged的第二个参数e的ProgressPercentage属性来获取该进度信息。如果用户还想传递更多的信息,可以使用ReportProgress的第二种重载,它的第二个参数userState将会传递给ProgressChanged事件的参数e的UserState属性。
    好,下面来一段MSDN上的例子:
    namespace BwTester
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }
    BackgroundWorker backgroundWorker;
    private void button1_Click(object sender, EventArgs e)
    {
    backgroundWorker = new BackgroundWorker();
    backgroundWorker.WorkerReportsProgress = true;
    backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
    backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
    backgroundWorker.RunWorkerAsync();
    }
    void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    progressBar1.Value = e.ProgressPercentage;
    }
    void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
    for (int i = 0; i < 500; i++)
    {
    backgroundWorker.ReportProgress(i);
    Thread.Sleep(100);
    }
    }
    }
    }
  • 相关阅读:
    EXTJS4.2——0.简介
    什么是JDBC?
    Applet和普通的Java应用程序有什么区别?
    final关键字、finally代码块和finalize()方法有什么区别?
    throw和throws有什么区别
    Java中的两种异常类型是什么?他们有什么区别?
    Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?
    flash插件
    算法复杂度分析中的符号(大Θ符号、大Ο符号...)
    Enumeration接口和Iterator接口的区别有哪些?
  • 原文地址:https://www.cnblogs.com/smiler/p/3317571.html
Copyright © 2011-2022 走看看