C# BackgroundWorker(异步线程)
日期: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(异步线程)的更多相关文章
- 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析
winform应用在使用一段时间后,切换到其他系统或者打开word.excel文档,再切换回winform应用时,系统有时出现不响应的现象.有时在锁屏后恢复桌面及应用时也发生此问题. 经微软支持确认, ...
- 线程:主线程、子线程 同步线程、异步线程 单线程、多线程 System.Threading与System.Windows.Threading
入门-------------------------------------------------------------------------------- 概述与概念 一个C#程序开始 ...
- 卸载AppDomain动态调用DLL异步线程执行失败
应用场景 动态调用DLL中的类,执行类的方法实现业务插件功能 使用Assembly 来实现 但是会出现逻辑线程数异常的问题 使用AppDomain 实现动态调用,并卸载. 发现问题某个插件中开启异步线 ...
- net异步线程获取返回值的三种方式
方式一:endInvoke using System; using System.Collections.Generic; using System.Text; using System.Thread ...
- AsyncTask实现异步线程通信
AsyncTask是Android1.5开始提供的一个封装了Thread与Handler可以实现异步线程的简单方式,不需要再自己实现子线程,然后在主线程处接受数据. 因为AsyncTask是用线程池, ...
- 安卓 异步线程更新Ui
异步跟新UI: 1.handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构 ...
- 关于GCD同步组实现多个异步线程的同步执行中的注意点
在App开发中经常会遇到多个线程同时向服务器取数据, 如果每个线程取得数据后都去刷新UI会造成界面的闪烁 也有可能出现部分数据还没有获取完毕造成程序crash 之前在网上看到很多是利用dispatch ...
- Eclipse RCP中超长任务单线程,异步线程处理
转自:http://www.blogjava.net/mydearvivian/articles/246028.html 在RCP程序中,常碰到某个线程执行时间比较很长的情况,若处理不好,用户体验度是 ...
- C# 在异步线程操作类的变量
如下代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } public string Me ...
- C#异步线程
对需要同时进行的操作进行异步线程处理:例如在一个button按钮点击事件中同时进行两种事件操作private void button_Click(object sender, EventArgs e) ...
随机推荐
- java入门了解09
1.JDK5新功能 (一).静态导入 import static java.lang.System.out; 使用时:直接写调用out()方法 (二).增强的for循环 只能用在数组:或是实现了Ite ...
- EntityFramework 学习 一 Table-Valued Function in Entity Framework 5.0
USE [SchoolDB] GO /****** Object: UserDefinedFunction [dbo].[GetCourseListByStudentID] */ SET ANSI_N ...
- 【海量之道】海量之道之SET模型
本文介绍了set模型. 一 提供海量服务时面对的场景 场景1:如何令黄村机房的TWS机器访问黄村机房的APP服务,避免TWS跨机房调用永丰机房的APP机器? 场景2:DB和Redis如何实现快慢分离, ...
- POJ 3349 Snowflake Snow Snowflakes (哈希表)
题意:每片雪花有六瓣,给出n片雪花,六瓣花瓣的长度按顺时针或逆时针给出,判断其中有没有相同的雪花(六瓣花瓣的长度相同) 思路:如果直接遍历会超时,我试过.这里要用哈希表,哈希表的关键码key用六瓣花瓣 ...
- strnpy函数
函数原型: char * strncpy ( char * destination, const char * source, size_t num ); 功能:从字符串source中复制 num个字 ...
- Python基础知识之字符串操作方法总结
Python 中字符串也是一种数据类型,针对此数据总结下常用的方法 1,字符串截取,变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾 ...
- mfc创建文档视图过程
一.如何创建文档视图界面: 创建新的文档视图界面,只需要调用CDocTemplate::OpenDocumentFile(strpath)即可.(strpath为要打开的文档路径,如果是NULL,则生 ...
- python实现无序列表:链表
介绍链表前我们先了解下什么是列表. 在对基本数据结构的讨论中,我们使用 Python 列表来实现所呈现的抽象数据类型.列表是一个强大但简单的收集机制,为程序员提供了各种各样的操作.然而,不是所有的编程 ...
- PS 滤镜— —Marble 效果
clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorithm'); I=imread ...
- qduoj 218 签到题
Description a坤和大明在一块由n个方块组成的棋盘(1 × n)上做游戏.一开始a坤在棋盘上放了k个矩形并且没有告诉大明具体位置.每个矩形都占a个连续方块(1 × a),任意两个矩形不可重叠 ...