Winfrom BackgroundWorker
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System.Threading;
using System.Windows.Forms; namespace BackgroundWorkerExplore
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} #region 异步处理
//002
private int RetrieveData(BackgroundWorker worker, DoWorkEventArgs e)
{
int max = (int)e.Argument;
int percent = 0;
for (int i = 1; i <= max; i++)
{
if (worker.CancellationPending) return i; percent = (int)(((double)i / (double)max) * 100);
// 摘要:
// 引发 System.ComponentModel.BackgroundWorker.ProgressChanged 事件。
// percentProgress: 已完成的后台操作所占的百分比,范围从 0% 到 100%。
// userState:/ 传递到 System.ComponentModel.BackgroundWorker.RunWorkerAsync(System.Object) 的状态对象。
worker.ReportProgress(percent, new KeyValuePair<int, string>(i, Guid.NewGuid().ToString()));
Thread.Sleep(500);
} return max;
}
//001 首先执行dowork
private void bgworker_DoWork(object sender, DoWorkEventArgs e)
{
try
{
e.Result = RetrieveData(this.bgworker, e);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
}
} //003
private void bgworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
KeyValuePair<int, string> record = (KeyValuePair<int, string>)e.UserState;
//操作UI
this.labelResultLeft.Text = string.Format("There are {0} records retrieved!", record.Key);
this.progressBarLeft.Value = e.ProgressPercentage;
this.lvLeft.Items.Add(record.Value);
} //004所有操作执行完后执行
private void bgworker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try
{
this.labelResultLeft.Text = string.Format("Total records: {0}", e.Result);
this.btnStart.Enabled = true;
this.btnStop.Enabled = false;
}
catch (TargetInvocationException ex)
{
MessageBox.Show(ex.InnerException.GetType().ToString());
}
}
#endregion private void btnStart_Click(object sender, EventArgs e)
{
if (this.bgworker.IsBusy) return; this.lvLeft.Items.Clear();
int MaxValue = 10;
this.bgworker.RunWorkerAsync(MaxValue);
this.btnStart.Enabled = false;
this.btnStop.Enabled = true;
} private void btnStop_Click(object sender, EventArgs e)
{
this.bgworker.CancelAsync();
}
}
}
运行效果:

Winfrom BackgroundWorker的更多相关文章
- BackgroundWorker实现的winfrom中实现异步等待加载图片显示
BackgroundWorker简介 BackgroundWorker在winfrom中有对应控件,该有三个事件:DoWork .ProgressChanged 和 RunWorkerCompl ...
- 实现winfrom进度条及进度信息提示,winfrom程序假死处理
1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...
- 实现winfrom进度条及进度信息提示
1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...
- [转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理
china_xuhua 原文地址 1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线 ...
- C# BackgroundWorker 详解
在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完 ...
- 【Winform】使用BackgroundWorker控制进度条显示进度
许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单...看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu ...
- C# 多線程&BackgroundWorker概念入門教程
感謝以下各位作者的貢獻~ 百度經驗舉了個例子,很好理解BackgroundWorker的用途(主要是用來啟動後台線程,而不阻塞調用程式的運行),收藏一下 http://jingyan.baidu.c ...
- 【C#】【Thread】BackgroundWorker的使用
BackgroundWorker 可以用于启动后台线程. 主要的事件及参数: 1.DoWork --当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递Do ...
- winfrom 隐藏任务栏(win7)
1:新建winfrom 窗体应用程序 2:拖入contextMenuStrip.notifyIcon 2个控件 3:如图 4:code: 注意:复制控件事件要注册 using System; usin ...
随机推荐
- @Schedule注解中的Cron表达式读取properties的方法
1.properties文件中增加配置项: datasync.cron=0 */10 * * * ? 2.定时任务类增加PropertySource注解: @PropertySource(" ...
- Wpf binging (二) 集合绑定
除去简单控件的数据绑定,还有集合控件的数据绑定,一下示例 这发现 source 变成了 itemsSource Path 变成了 DisplayMemberPath itemsSource:代 ...
- linux查看日志文件命令
转:https://www.cnblogs.com/zdz8207/p/linux-log-tail-cat-tac.html linux查看日志文件内容命令tail.cat.tac.head.ech ...
- python 对 sqlite3的简单使用
SQLite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成.Python就内 ...
- 神州数码HSRP(热备份路由协议)配置
实验要求:掌握HSRP配置方法 拓扑如下 R1 enable 进入特权模式 config 进入全局模式 hostname R1 修改名称 interface g0/6 进入端口 ip address ...
- 轻松理解AOP(面向切面编程)
https://my.oschina.net/yanquan345/blog/203415
- yamux多路复用的使用例子
yamux yamux 是一个多路复用库.它依赖于底层可靠有序连接.如TCP. 提供基于流的多路利用 例子如下: Server package main // 多路复用 import ( " ...
- wps 邮件 通讯小灵通 长沙杭州
记得在天涯上看过一个热贴,关于贵族与世家的,文中提到号称当今贵族的六大世家,什么“汝南周氏”.“吴兴沈氏”之类,更有甚者,为了比拼,追本溯源,把孔子他老人家也抬了出来,号称孔夫子的多少多少代传人,当时 ...
- word中编辑论文公式对齐问题
这里只说在word中编辑公式时,公式居中,编号右对齐的情况. 在编辑公式时,我平时就是右对齐,然后通过敲击空格键进行公式的居中,然而这样并不美观.所以接下来学习一下: 1)首先打开视图-->标尺 ...
- javaScript 深拷贝、浅拷贝
在 JS 中有一些基本类型像是Number.String.Boolean,而对象就是像这样的东西{ name: 'Larry', skill: 'Node.js' },对象跟基本类型最大的不同就在于他 ...