zoukankan      html  css  js  c++  java
  • 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事件处理程序需要检查这个属性来决定是否应该停止处理 } } }
  • 相关阅读:
    LVS的DR模式测试案例<仅个人记录>
    awk命令小结
    iptables命令提取总结,包含扩展模块<取自朱双印博客>
    如何配置nginx屏蔽恶意域名解析指向《包含隐藏nginx版本号》
    CentOS升级OpenSSL至OpenSSL 1.1.0f版本<其中有遇到libcrypto.so的问题>
    U-Mail企业邮箱如何导入授权文件
    Linux花生壳使用篇
    windows远程桌面连接时,显示发生身份验证错误,给函数提供的身份无效
    批量屏蔽符合条件的IP地址,支持添加白名单,IP段,增量,大于指定次数的IP
    rsync 定时备份<crontab+backrsync.sh> 简陋版
  • 原文地址:https://www.cnblogs.com/xieqianli/p/4169333.html
Copyright © 2011-2022 走看看