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的使用一二(可视化编程,开始后台工作,报告进度,取消后台工作等)的更多相关文章

  1. iOS学习33之可视化编程-StoryBoard

    1. storyBoard与xib 1> 概述 iOS下可视化编程分为两种方式: xib 和 storyboard 在使用 xib 和 storyboard 创建 GUI 过程中,以 XML 文 ...

  2. iOS学习32之UIKit框架-可视化编程-XIB

    1. Interface Builder 可视化编程 1> 概述 GUI : 图形用户界面(Graphical User Interface, 简称GUI, 又称图形化界面) 是指采用图形方式显 ...

  3. Atitit.可视化编程jbpm6 的环境and 使用总结...

    Atitit.可视化编程jbpm6 的环境and 使用总结... 1. Jbpm的意义 1 2. Jbpm6环境配置 2 2.1. Down 2 2.2. Install eclipse jbpm p ...

  4. iOS学习之UI可视化编程-StoryBoard

    一.StoryBoard与xib 对比: 相同点:都属于IB编程的方式,可以快速构建GUI. 不同点:xib侧重于单文件(单独的控制器或者视图)编辑,storyboard侧重于多页面关联.storyb ...

  5. iOS学习之UI可视化编程-XIB

    一.Interface Builder可视化编程 1.Interface Builder简介: GUI:图形用户界面(Graphical User Interface,简称GUI,又称图形用户接口)是 ...

  6. Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解

    我们编写程序就是为了方便用户使用, 我觉得UI设计的核心就是简洁, 操作过于繁琐的程序让很大一部分用户敬而远之. 即使功能强大, 但是人们更愿意使用易于操作的软件. 近年流行起来的操作手势和逐渐趋于成 ...

  7. 可视化编程开发板TurnipBit支持LED亮度可调功能

    微软的makecode编辑器更新至版本v0.12.64.新增LED的可调亮度功能.而作为中文版可视化编程的口袋计算机TurnipBit完全兼容micro:bit,同样支持LED的亮度可调功能. 该项功 ...

  8. MicroPython可视化编程开发板—TurnipBit自制MP3教程实例

    转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇) 当前我们都生活在一个有声有色的社会当中,欣赏美丽的景色,享受动人的音乐, ...

  9. iOS开发UIKit框架-可视化编程-XIB

    1. Interface Builder 可视化编程 1> 概述 GUI : 图形用户界面(Graphical User Interface, 简称GUI, 又称图形化界面) 是指采用图形方式显 ...

随机推荐

  1. Cocos2d-JS 项目接入 触控广告平台(基于anysdk2.0.2)

    本文以Cocos2d-JS项目作为示例,讲解如何集成AnySDK-JS. 一.如何创建项目我就省略了,直接进入主题. 1.1 首先,我需要下载anysdk框架包,下载地址:http://www.any ...

  2. Snow White,摘自iOS应用Snow White and more stories

    Once upon a time, there was a land. 从前,有个国度. It was ruled by an evil queen. 它被一位邪恶的女王统治. Every day t ...

  3. 【甘道夫】Eclipse+Maven搭建HBase开发环境及HBaseDAO代码演示样例

    环境: Win764bit Eclipse Version: Kepler Service Release 1 java version "1.7.0_40" 第一步:Eclips ...

  4. JVM无法启动,jps无法运行,提示内存不足

    原因:系统设置中有设置了不允许over commit so,无法分配足够内存 /etc/sysctl.conf vm.overcommit_memory=1    或者sysctl vm.overco ...

  5. 04-树4 是否同一棵二叉搜索树(25 point(s)) 【Tree】

    04-树4 是否同一棵二叉搜索树(25 point(s)) 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和 ...

  6. Spring boot框架项目,使用maven命令将配置文件打包到jar包外,项目运行读取jar外配置文件

    1.1      在eclipse中配置maven命令 Mvn -e clean package -Ptest -DskipTests=true 1.1.1    执行命令之后得到jar 1.2    ...

  7. Codeforces Round #394 (Div. 2) C. Dasha and Password —— 枚举

    题目链接:http://codeforces.com/problemset/problem/761/C C. Dasha and Password time limit per test 2 seco ...

  8. UVA1635 Irrelevant Elements —— 唯一分解定理 + 二项式定理

    题目链接:https://vjudge.net/problem/UVA-1635 (紫书320) 题解: 1.根据二项式定理, 可得递推公式: C(n,k) = (n-k+1)/k * C(n, k- ...

  9. 关于lock锁

    在 jdk1.5 之后,并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能,Lock 接口提供了与 synchronized 关键字类似的同步功能,但需要在使用时手动获取锁和释放锁. lo ...

  10. 纯js实现省市级联效果

    我们都知道一般有注册的时候会让用户填入省市啊地区什么的,然后我就想使用纯js制作一个省市级联的效果,只是用于学习以及回顾温习用,首先看下效果图,界面很丑啊,不要嫌弃! 首先还是先看下我的项目目录吧 很 ...