日期:2018年11月28日

环境:Windows 10,VS2015

前言 

.NET 类库中提供了一个快捷使用多线程的帮助类BackgroundWorker,能够快速创建一个新的线程,并能报告进度,暂停,以及在线程完成后处理别的任务。

创建简单UI

Demo code
 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms; namespace BackgroundWorkerTest
{
public partial class Form1 : Form
{
private BackgroundWorker bkgdWorker;
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
bkgdWorker = new BackgroundWorker();
bkgdWorker.WorkerReportsProgress = true;//允许报告进度
bkgdWorker.WorkerSupportsCancellation = true;//允许取消线程
bkgdWorker.DoWork += new DoWorkEventHandler(bkgdWorker_DoWork);//添加主要工作
bkgdWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bkgdWorker_RunWorkerCompleted);//添加线程完成的处理
bkgdWorker.ProgressChanged += new ProgressChangedEventHandler(bkgdWorker_ProgressChanged);//添加进度变化处理
} //主要工作逻辑(不可处理UI相关)
private void bkgdWorker_DoWork(Object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = (BackgroundWorker)sender;
int n = ;
long sum = ; if (e.Argument != null)
{
n = (int)e.Argument;
} for (int i=;i<= n; i++)
{
if (bw.CancellationPending)
{
e.Cancel = true;//此处设置Cancel=true后,就可以在RunWorkerCompleted中判断e.Cancelled是否为true
break;
}
sum += i;
Thread.Sleep();//避免太快,让线程暂停一会再报告进度
//bw.ReportProgress(i/10);//报告进度//调用ReportProgress()方法报告进度,同时触发ProgressChanged事件
bw.ReportProgress(i / , "当前i的值为"+ Convert.ToString(i));//报告进度和userState
}
e.Result = sum;
} //进度变化处理
private void bkgdWorker_ProgressChanged(Object sender, ProgressChangedEventArgs e)
{
pbr_Test.Value = e.ProgressPercentage;
lb_Message.Text = e.UserState.ToString();
} //线程完成处理
private void bkgdWorker_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e)
{
if (!(e.Error == null))
{
MessageBox.Show("Fail:"+e.Error.Message);
}
else if(e.Cancelled)
{
MessageBox.Show("Failed: thread Cancelled by operator");
}
else
{
lb_Message.Text = "计算结果为:" + e.Result.ToString();
MessageBox.Show("thread complete");
}
} private void btn_Start_Click(object sender, EventArgs e)
{
if (bkgdWorker.IsBusy)
MessageBox.Show("The thead running now.");
else
bkgdWorker.RunWorkerAsync();//调用该方法才会启动线程
} private void btn_Cancal_Click(object sender, EventArgs e)
{
if (bkgdWorker.IsBusy)
{
bkgdWorker.CancelAsync();//取消线程
}
else
{
MessageBox.Show("There is no thead running now.");
}
}
}
}

C# BackgroundWorker(异步线程)的更多相关文章

  1. 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析

    winform应用在使用一段时间后,切换到其他系统或者打开word.excel文档,再切换回winform应用时,系统有时出现不响应的现象.有时在锁屏后恢复桌面及应用时也发生此问题. 经微软支持确认, ...

  2. 线程:主线程、子线程 同步线程、异步线程 单线程、多线程 System.Threading与System.Windows.Threading

    入门-------------------------------------------------------------------------------- 概述与概念    一个C#程序开始 ...

  3. 卸载AppDomain动态调用DLL异步线程执行失败

    应用场景 动态调用DLL中的类,执行类的方法实现业务插件功能 使用Assembly 来实现 但是会出现逻辑线程数异常的问题 使用AppDomain 实现动态调用,并卸载. 发现问题某个插件中开启异步线 ...

  4. net异步线程获取返回值的三种方式

    方式一:endInvoke using System; using System.Collections.Generic; using System.Text; using System.Thread ...

  5. AsyncTask实现异步线程通信

    AsyncTask是Android1.5开始提供的一个封装了Thread与Handler可以实现异步线程的简单方式,不需要再自己实现子线程,然后在主线程处接受数据. 因为AsyncTask是用线程池, ...

  6. 安卓 异步线程更新Ui

    异步跟新UI: 1.handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构 ...

  7. 关于GCD同步组实现多个异步线程的同步执行中的注意点

    在App开发中经常会遇到多个线程同时向服务器取数据, 如果每个线程取得数据后都去刷新UI会造成界面的闪烁 也有可能出现部分数据还没有获取完毕造成程序crash 之前在网上看到很多是利用dispatch ...

  8. Eclipse RCP中超长任务单线程,异步线程处理

    转自:http://www.blogjava.net/mydearvivian/articles/246028.html 在RCP程序中,常碰到某个线程执行时间比较很长的情况,若处理不好,用户体验度是 ...

  9. C# 在异步线程操作类的变量

    如下代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } public string Me ...

  10. C#异步线程

    对需要同时进行的操作进行异步线程处理:例如在一个button按钮点击事件中同时进行两种事件操作private void button_Click(object sender, EventArgs e) ...

随机推荐

  1. tkinter模块中常用的参数

    以下内容来自于:http://www.cnblogs.com/aland-1415/p/6849193.html(个别内容掺入了自己的重新整理) cnf={}与**kw: cnf={}这是一个默认参数 ...

  2. Linux课程---8、Linux启动流程

    Linux课程---8.Linux启动流程 一.总结 一句话总结: grub启动引导界面(比如装了多系统,选择系统),找到linux内核 启动init程序,加载各种驱动 1.进入grub界面选择相应的 ...

  3. Selenium-键盘操作

    在webdriver的Keys类中提供了键盘所有的按键操作,当然也包括一些常见的组合操作如Ctrl+A全选),Ctrl+C(复制),Ctrl+V(粘贴).更多参考官方文档对应的编码http://sel ...

  4. hihocoder-1274 自行车架(高维dp)

    时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi的宿舍楼下有一块用于停自行车的区域.平时自行车都停得非常杂乱,于是楼长打算去买一排自行车架用来停车.自行车架一般有P个 ...

  5. 搭建JavaEE项目是遇到的几个问题

    问题描述:无法读取spring mvc的xsd文件 参考http://eric-yan.iteye.com/blog/1908470 schema_reference.4: Failed to rea ...

  6. 【leetcode刷题笔记】Sum Root to Leaf Numbers

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...

  7. [冬令营模拟]GTSG2018

    上学期没有去 GTSG,于是今天老师让我们来做一下 GTSG2018 Day1 & Day3 Day1 在上午当成一场考试来搞了,Day3 由于锅太多而且 T3 玄学而被放到下午自学... 上 ...

  8. CH5103 [NOIP2008]传纸条[线性DP]

    给定一个 N*M 的矩阵A,每个格子中有一个整数.现在需要找到两条从左上角 (1,1) 到右下角 (N,M) 的路径,路径上的每一步只能向右或向下走.路径经过的格子中的数会被取走.两条路径不能经过同一 ...

  9. bzoj 4817: [Sdoi2017]树点涂色 LCT+树链剖分+线段树

    题目: Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. Bob可能会进 ...

  10. Access中创建子数据表/主子数据表

    摘 要:我们为什么要使用Access,而不用Excel,因为数据库可以大幅度地消除冗余数据,其方法就是将数据拆分到不同的表中,再通过“关系”建立表间的联系.那么如何确定表间的关系呢.表之间的关系是通过 ...