System.ComponentModel.BackgroundWorker在WinForm中的异步使用
2016-06-14 20:14
369 查看
为了防止操作过程中界面卡死,和WinForm搭配最适合的就是BackgroundWorker了。BackgroundWorker 类
using System; using System.ComponentModel; using System.Threading; using System.Windows.Forms; namespace ProcessImpactID { public partial class Form1 : Form { BackgroundWorker worker = new BackgroundWorker(); public Form1() { InitializeComponent(); worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); worker.ProgressChanged += Worker_ProgressChanged; //set it to true for support cancel event //when call CancelAsync() it can set property CancellationPending to true. worker.WorkerSupportsCancellation = true; //set it to true for raise Progress Report. worker.WorkerReportsProgress = true; } private void btnStart_Click(object sender, EventArgs e) { if (worker.IsBusy) { MessageBox.Show("the process has been started"); return; } worker.RunWorkerAsync("e.argument"); } private void btnStop_Click(object sender, EventArgs e) { if (worker.IsBusy) { worker.CancelAsync(); } } private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { //this is UI Thread this.label1.Text = e.ProgressPercentage.ToString(); } void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { //bool isThreadPoolThread = System.Threading.Thread.CurrentThread.IsThreadPoolThread; //this is UI Thread if (e.Error != null) { MessageBox.Show(e.Error.Message, "Error"); return; } if (e.Cancelled) { MessageBox.Show("the process has been cancelled"); return; } MessageBox.Show(e.Result.ToString()); } void worker_DoWork(object sender, DoWorkEventArgs e) { //bool isThreadPoolThread = System.Threading.Thread.CurrentThread.IsThreadPoolThread; string str = (string)e.Argument; string result = "work result"; worker.ReportProgress(0); for (int i = 0; i < 100; i++) { //if CancellationPending is true, stop process. //and report process result. if (worker.CancellationPending) { e.Cancel = true; break; } Thread.Sleep(1000); //Report Progress worker.ReportProgress(i * 1); } //set the RunWorkerCompleted result e.Result = string.Format("{0} => {1}", str, result); } } }
相关文章推荐
- php中面向对象的概念
- POJ 3109 Inner Vertices 树状数组
- andriod之乐学成语
- Android OptionMenu (选项菜单) 和 ContextMenu (上下文菜单) 、 SubMenu (子菜单)
- 数据库练习
- vuejs学习小记 单次插值
- 最长递增子序列问题(最大流)
- 初来驾到,Android小白
- Java高级特性之解析XML
- svn 图标所表示的意思
- 脚本编程技术
- 数据库的设计范式知识
- 导航地图
- Html中修改视频播放器的param属性的value的值
- 下载Google Play中的APK
- android 移植ffmpeg
- 《hihoCoder太阁最新面经算法竞赛4》题目解析【含源代码】
- MergeSort(递归)
- HTML5 服务器发送事件(server-sent events)
- HBase -ROOT-和.META.表结构