• GUI异步编程之BackgroundWorker类


    GUI编程中,经常需要另建一个线程,在后台运行以完成某项工作,并不时地与界面主线程进行通信,以改变界面显示。BackgroundWorker类为此而生。

    BackgroundWorker类的主要成员:

    属性:

      WorkerReportsProgress :用于设置后台任务是否可以把它的进度汇报给主线程

      WorkerSupportsCancellation :是否支持从主线程取消

      IsBusy:检查后台任务是否正在运行

    事件:

      DoWork : 在后台线程开始的时候触发该事件

      ProgressChanged : 在后台任务需要汇报状时候触发该事件,主要用于中途让主界面更新显示。

      RunWorkerCompleted : 在后台工作线程退出的时候触发该事件

    方法:

      RunWorkerAsync(): 主线程调用该方法开启后台线程并执行DoWork事件处理程序

      CancelAsync(): 调用CancelAsync方法把CancellationPending属性设为true。DoWork事件处理程序需要检查这个属性来决定是否应该停止处理

      ReportProgress(): 主动向主线程汇报,此时触发事件响应程序ProcessChanged_Handler(),参数可重载,用于传出参数

    下面是一个进度条的示例,点击【处理】开始进度条,中途点击【取消】马上可以中止进度条。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace theAsync
    {
        public partial class FormMain : Form
        {
            BackgroundWorker bgWorker = new BackgroundWorker();
    public FormMain() { InitializeComponent(); //设置BackgroundWorker属性 bgWorker.WorkerReportsProgress = true;//可以向主线程汇报进度 bgWorker.WorkerSupportsCancellation = true;//可以从主线程取消工作线程 //连接BackgroundWorker对象的处理程序 bgWorker.DoWork += DoWork_Handler;//在后台线程开始的时候触发Dowork事件 bgWorker.ProgressChanged += ProcessChanged_Handler;//在后台任务汇报状态的时候触发ProgressChanged事件,用于后台处理过程中和主线程的通信 bgWorker.RunWorkerCompleted += RunWorkerCompleted_Handler;//后台工作线程退出的时候触发RunWorkerCompleted事件 } private void btnProcess_Click(object sender, EventArgs e) { if (!bgWorker.IsBusy) bgWorker.RunWorkerAsync();//启动后台线程并且执行DoWork事件处理程序DoWork_Handler() } private void ProcessChanged_Handler(object sender, ProgressChangedEventArgs args) { progressBar.Value = args.ProgressPercentage; } private void DoWork_Handler(object sender, DoWorkEventArgs args) { BackgroundWorker worker = sender as BackgroundWorker; for (int i = 1; i <= 100; i++ ) { if (worker.CancellationPending)//检查任务是否被取消,若取消,此处主动处理 { args.Cancel = true; break; } else { worker.ReportProgress(i);//主动向主线程汇报,此时触发事件响应程序ProcessChanged_Handler(),参数重载为DoWorkEventArgs Thread.Sleep(100); } } } private void RunWorkerCompleted_Handler(object sender, RunWorkerCompletedEventArgs args) { progressBar.Value = 0; if (args.Cancelled) MessageBox.Show("处理取消"); else MessageBox.Show("处理完成"); } private void btnCancelled_Click(object sender, EventArgs e) { bgWorker.CancelAsync();//调用CancelAsync方法把CancellationPending属性设为true。DoWork事件处理程序需要检查这个属性来决定是否应该停止处理 } } }
  • 相关阅读:
    Effective C++学习笔记之explicit
    腾讯面试经验2
    腾讯面试经验
    值类型和引用类型的区别,struct和class的区别
    【转载】固态硬盘的S.M.A.R.T详解
    SSD的传输总线、传输协议、传输接口
    坏块管理(Bad Block Management,BBM)
    脱离SVN的控制
    Func的介绍
    简单AOP
  • 原文地址:https://www.cnblogs.com/xieqianli/p/4169333.html
Copyright © 2020-2023  润新知