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事件处理程序需要检查这个属性来决定是否应该停止处理 } } }
  • 相关阅读:
    利用栈计算后缀式
    中缀式转换为后缀式(逆波兰式)方法
    JAVA字符串首字母大小写转换(截取转换+移动ASCII编码)
    VSCode格式化代码后,设置代码不自动换行
    oracle连接不上,提示监听服务不可用的解决办法
    壹周立波秀
    欣慰,举手之力,帮助一个老同学恢复了博士论文文档
    开发中的思维转换也是一种创新-思维创新
    电脑借液晶电视显示器出现雪花点的另类解决办法
    邮箱已满解决办法
  • 原文地址:https://www.cnblogs.com/xieqianli/p/4169333.html
Copyright © 2011-2022 走看看