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. c++通用写文件调试代码

    #include <stdio.h>#include <sstream>#include <iostream> std::stringstream strs;str ...

  2. SQL Server 2005中top关键字的用法

    1.返回N条记录数 select top n * from <表名> [查询条件] 2.返回总结果集中指定百分比记录数 select top n percent * from <表名 ...

  3. git基本操作---持续更新(2017-08-11)

    git 强制push $ git push -u origin master -f 查看本地标签 $ git tag 打标签并添加备注 $ git tag 20170811 -m"图片保存多 ...

  4. appium()-java-client-api

    //appium java-client-api 介绍 原文地址:http://appium.github.io/java-client/index-all.html#_S_ A B C D E F  ...

  5. for(String s:list)的运行

    源码 List<String> list = new ArrayList<>(); for (String s:list){ } class文件 List<String& ...

  6. Could not find com.android.tools.lint:lint-gradle:26.1.2.

    allprojects { repositories { flatDir { dirs 'libs' } jcenter() google() }}

  7. 基本动画、复合动画设置 平移、缩放、旋转、透明度 编码实现 xml实现

    public class VAActivity extends Activity { private ImageView iv_animation; private TextView tv_anima ...

  8. 向HTML页面传入参数

    这次是想将参数传入HTML页面,通过js获取参数信息,动态生成HTML页面内容: 方法一: <script> function GetArgsFromHref(sHref, sArgNam ...

  9. POJ 2506 Tiling (递推 + 大数加法模拟 )

    Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7965   Accepted: 3866 Descriptio ...

  10. Codeforces Round #398 (Div. 2) C. Garland —— DFS

    题目链接:http://codeforces.com/contest/767/problem/C 题解:类似于提着一串葡萄,用剪刀剪两条藤,葡萄分成了三串.问怎样剪才能使三串葡萄的质量相等. 首先要做 ...