BackgroundWorker的使用一二(可视化编程,开始后台工作,报告进度,取消后台工作等)
C# 提供了BackgroundWorker功能非常强大,可以将某项工作放到后台运行,可以让后台报告进度,可以取消后台工作......
BackgroundWorker的上述功能是通过
1. 三个主要事件

DoWork--后台事件。定义完成需要做的后台工作
ProgressChanged--进度报告事件。定义有进度报告产生时进行要做的工作
RunWorkerCompleted--后台完成事件。定义后台工作完成后要做的工作
2 2+x个属性:

WorkerReportsProgress -- 是否允许报告进度
WorkerSupportsCancellation -- 是否允许取消
有些属性是在运行时设置的,不在可视化区,如
backgroundWorker1.CancellationPending --执行CancelAsync()会设置
DoWorkEventArgs.Cancel --设置此属性,通知RunWorkerCompleted已被取消
3.三个方法
backgroundWorker1.RunWorkerAsync(); //开始异步工作
backgroundWorker1.CancelAsync(); //取消异步工作
//需要注意的是,执行了CancelAsync()后,只是设置了一个CancellationPending标志,后台工作并没有真正挺下来,需要明确的代码退出后台工作
backgroundWorker1.ReportProgress(int progress, object userstate); //报告进度
4. 可视化开发。VS开发环境中,工具箱提供了可视化的控件。
简单使用步骤如下
1)往FORM中拖拽一个BackgroundWorker控件
2)设置两个属性:
WorkerReportsProgress -- 是否允许报告进度
WorkerSupportsCancellation -- 是否允许取消
3)写三个事件的代码
DoWork、ProgressChanged、RunWorkerCompleted
4)报告进度
某些耗时较长的工作,我们希望在工作中途报告进度,可在DoWork事件中,加入
backgroundWorker1.ReportProgress(int progress, object userstate)代码报告进度,userState可用于返回其他数据
5)终止后台工作
(1)执行CancelAsync(),此代码设置CancellationPending标志
(2)后台工作中用代码检测CancellationPending标志,检测到CancellationPending后
处理善后工作
可选:设置DoWorkEventArgs 参数的Cancel属性为true(e.Cancel=True)
终止后台工作(return)
(3)可选:终止后处理
RunWorkerCompleted事件中检测RunWorkerCompletedEventArgs 参数,是否为终止
RunWorkerCompletedEventArgs.Cancel=true(第二部的设置值)
终止后处理代码
5. 多说无益,上酸菜
1)FORM设置

2)上代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms; namespace VisibleBackgroundWorker
{
public partial class Form1 : Form
{
int total = ; public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{ }
/// <summary>
/// 后台作业代码
/// </summary>
/// <param name="sender"></param>
/// <param name="e">e.Cancel用于返回终止标志,e.Result用于返回数据,e.Argument为传入的参数</param>
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
List<string> itemList = new List<string>();
for (int i = ; i < total; i++)
{
if (backgroundWorker1.CancellationPending)
{ //如果执行了CancelAsync()
e.Cancel = true; //设置后台作业取消标志
return;
}
string item = "item " + i.ToString();
backgroundWorker1.ReportProgress(i,item);
itemList.Add(item);
System.Threading.Thread.Sleep();
}
e.Result = itemList;//返回结果 }
/// <summary>
/// 进度报告事件,可用于显示进度、中间结果等
/// </summary>
/// <param name="sender"></param>
/// <param name="e">e.ProgressPercentage为进度,e.UserState可定义的回传数据</param>
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
int p = e.ProgressPercentage;
string item = e.UserState as string;
label1.Text = "Progress:" + p.ToString();
listBox1.Items.Add(item); }
/// <summary>
/// 后台作业完成事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e">e.Cancel为是否被终止的标志</param>
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if(e.Cancelled)
{//中途终止
label1.Text = "Cancel!";
}
else
{//正常结束
label1.Text = "Complete!";
} listBox2.Items.AddRange((e.Result as List<string>).ToArray());
} private void button1_Click(object sender, EventArgs e)
{ //终止后台作业标志(设置CancellationPending标志)
backgroundWorker1.CancelAsync();
} private void btnGo_Click(object sender, EventArgs e)
{//开始后台作业
int arg = ;//传到后台作业的参数
backgroundWorker1.RunWorkerAsync(arg);
}
}
}
BackgroundWorker的使用一二(可视化编程,开始后台工作,报告进度,取消后台工作等)的更多相关文章
- iOS学习33之可视化编程-StoryBoard
1. storyBoard与xib 1> 概述 iOS下可视化编程分为两种方式: xib 和 storyboard 在使用 xib 和 storyboard 创建 GUI 过程中,以 XML 文 ...
- iOS学习32之UIKit框架-可视化编程-XIB
1. Interface Builder 可视化编程 1> 概述 GUI : 图形用户界面(Graphical User Interface, 简称GUI, 又称图形化界面) 是指采用图形方式显 ...
- Atitit.可视化编程jbpm6 的环境and 使用总结...
Atitit.可视化编程jbpm6 的环境and 使用总结... 1. Jbpm的意义 1 2. Jbpm6环境配置 2 2.1. Down 2 2.2. Install eclipse jbpm p ...
- iOS学习之UI可视化编程-StoryBoard
一.StoryBoard与xib 对比: 相同点:都属于IB编程的方式,可以快速构建GUI. 不同点:xib侧重于单文件(单独的控制器或者视图)编辑,storyboard侧重于多页面关联.storyb ...
- iOS学习之UI可视化编程-XIB
一.Interface Builder可视化编程 1.Interface Builder简介: GUI:图形用户界面(Graphical User Interface,简称GUI,又称图形用户接口)是 ...
- Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解
我们编写程序就是为了方便用户使用, 我觉得UI设计的核心就是简洁, 操作过于繁琐的程序让很大一部分用户敬而远之. 即使功能强大, 但是人们更愿意使用易于操作的软件. 近年流行起来的操作手势和逐渐趋于成 ...
- 可视化编程开发板TurnipBit支持LED亮度可调功能
微软的makecode编辑器更新至版本v0.12.64.新增LED的可调亮度功能.而作为中文版可视化编程的口袋计算机TurnipBit完全兼容micro:bit,同样支持LED的亮度可调功能. 该项功 ...
- MicroPython可视化编程开发板—TurnipBit自制MP3教程实例
转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇) 当前我们都生活在一个有声有色的社会当中,欣赏美丽的景色,享受动人的音乐, ...
- iOS开发UIKit框架-可视化编程-XIB
1. Interface Builder 可视化编程 1> 概述 GUI : 图形用户界面(Graphical User Interface, 简称GUI, 又称图形化界面) 是指采用图形方式显 ...
随机推荐
- Android笔记之强大的buildConfigField
在进行项目开发或维护时,经常会遇到调试和发布所用到的参数值不一致的情况 例如,服务器会分测试和正式,为了能方便地更改(自动更换)服务器地址,buildConfigField就派上用场了 以前都是手动更 ...
- 剑指Offer:重建二叉树【7】
剑指Offer:重建二叉树[7] 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5 ...
- Linux-VMware三种网络模式
虚拟机网络模式 对于VMware虚拟软件来说,有三种网络模式 1.桥接 2.NAT 3.Host-only 桥接 桥接网络是指本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接,因此物理网卡和虚 ...
- 最简单ajax,$.post()用法
最简单的ajax,$.post()用法 $.post("action.php",{'email':$('#email').val(),'address':$('#address') ...
- RBAC打造通用web管理权限
https://www.cnblogs.com/lamp01/p/6576432.html https://www.imooc.com/learn/799
- nginx-upsync-module安装
1.安装nginx-upsync-module wget https://github.com/weibocom/nginx-upsync-module/archive/master.zip 作用:n ...
- python把字典写入excel之一例
直接上代码: # -*- coding: utf-8 -*- import xlsxwriter #生成excel文件 def generate_excel(expenses): workbook = ...
- codeforces B. Ciel and Flowers 解题报告
题目链接:http://codeforces.com/problemset/problem/322/B 题目意思:给定红花.绿花和蓝花的朵数,问组成四种花束(3朵红花,3朵绿花,3朵蓝花,1朵红花+1 ...
- hdu 1715 大菲波数(大数)
题意:整数大数加法 思路:大数模板 #include<iostream> #include<stdio.h> #include<stdlib.h> #include ...
- js some和filter用法和区别
some方法 array1.some(callbackfn[, thisArg]) 对数组array1中的每个元素调用回调函数callbackfn,当回调函数返回true或者遍历完所有数组后,some ...