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. mysql 5.6 bug

    https://dev.mysql.com/doc/refman/5.6/en/account-management-sql.html USE mysql; SELECT Host,User FROM ...

  2. Find out when memory leaks are a concern and how to prevent them

    Handling memory leaks in Java programs Find out when memory leaks are a concern and how to prevent t ...

  3. Java中实现函数的阻塞

    使用Object.wait()即可实现阻塞,使用Object.notify()解除阻塞,代码示例如下 MainFrame.java import javax.swing.JFrame; import ...

  4. Memcached中的存取命令详解

    本文和大家分享的主要是Memcached中常用的一些存取命令相关用法,一起来看看吧,希望对大家学习Memcached有所帮互助. 存储命令 set:不管key存在与否,强制进行set操作: add:必 ...

  5. virtualBox 不能开启一个新任务的错误

    2016.06.05 这两天想在virtualbox上安装CentOS7.0玩,遇到一个问题: 不能为虚拟电脑 CentOS7 打开一个新任务. The virtual machine 'CentOS ...

  6. Tomcat Session Clustering

    搭建 Tomcat 集群需要解决很多的问题,其中之一就是要解决 Session 共享问题.小规模集群可以使用 Tomcat 提供的 Session Clustering 来解决. For the im ...

  7. 在windows下把Mongodb设置系统服务

    把Mongodb Server 设置为系统,方便启动与停止 今天一时兴起在本地安装了下Mongodb服务,安装完后,创建了配置文件为数据库服务指明在哪里存储数据库原始文件,随即就启动了mongo se ...

  8. MySQL学习笔记(五)—— 子查询及联结

    子查询: 子查询,即嵌套在其他查询中的查询.例如我们有这样几个表,顾客表,订单表,商品表,我们想知道有哪些客户买了商品A,那么我们就需要先查看哪些订单里包含了商品A,然后根据订单查出是哪些客户. my ...

  9. Learning Android ActionBar

    PART1:Make Android2.1 Support ActionBar Last evening I learnt how to make android2.1 support actionb ...

  10. Android设备管理器 DevicePolicyManager

    设备管理器有个特点,你注册了之后如果不解除注册就会难以卸载带有设备管理器的应用,目前4.3版本仍未提示用户如何卸载,maybe later. 在「设定-安全」你可以看见「设备管理器」,它提供一些高级功 ...