支持取消操作和暂停操作的Backgroundworker示例一则
来源:互联网 发布:海康网络监控摄像头 编辑:程序博客网 时间:2024/06/05 23:36
摘要:Backgroundworker是默认支持取消功能的,但是默认不支持暂停。本文通过ManualResetEvent来实现一个暂停功能,并给出其相关的范例。
效果图如下所示:
初始状态
暂停状态
取消状态
关于backgroundworker运作的已有原理此处不再赘述,又想详细了解的请看MSDN范例:http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker(v=vs.110).aspx
在此基础上的暂停功能原理简述:ManualResetEvent类可以实现“通知一个或者多个正在等待 的线程已发生的事件。 ”的功能。
具体代码如下所示:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;namespace BackGroundWorker{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } BackgroundWorker bgWorker = null; private ManualResetEvent manualReset = new ManualResetEvent(true); private void InitiateBgWorker() { bgWorker = new BackgroundWorker(); bgWorker.WorkerReportsProgress = true; bgWorker.WorkerSupportsCancellation = true; bgWorker.DoWork+=new DoWorkEventHandler(bgWorker_DoWork); bgWorker.RunWorkerCompleted+=new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted); bgWorker.ProgressChanged+=new ProgressChangedEventHandler(bgWorker_ProgressChanged); } private void bgWorker_DoWork(object send,DoWorkEventArgs e) { for (int i = 0; i < 100; i++) { if(bgWorker.CancellationPending)//如果用户申请了取消曹组 { for (int k = i; k >= 0; k--) { Thread.Sleep(10); bgWorker .ReportProgress(k);//模拟一个回滚的效果 } e.Cancel = true; return;//跳出操作123 } //操作1 //操作2 //操作3 manualReset.WaitOne();//如果ManualResetEvent的初始化为终止状态(true),那么该方法将一直工作,直到收到Reset信号。然后,直到收到Set信号,就继续工作。 //反之亦然 Thread.Sleep(500); bgWorker.ReportProgress(i + 1); } } private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; } private void bgWorker_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e) { if (e.Cancelled) MessageBox.Show("用户取消了操作"); else MessageBox.Show("正常完成了操作"); } private void button1_Click(object sender, EventArgs e) { InitiateBgWorker(); bgWorker.RunWorkerAsync(); } private void button2_Click(object sender, EventArgs e) { if (button2.Text == "暂停") { manualReset.Reset();//暂停当前线程的工作,发信号给waitOne方法,阻塞 button2.Text = "继续"; } else { manualReset.Set();//继续某个线程的工作 button2.Text = "暂停"; } } private void button3_Click(object sender, EventArgs e) { bgWorker.CancelAsync(); } }}
完整代码包下载地址(含winform):http://download.csdn.net/detail/fanrong1985/8135959
0 0
- 支持取消操作和暂停操作的Backgroundworker示例一则
- 支持取消操作和暂停操作的Backgroundworker
- 支持取消操作和暂停操作的Backgroundworker
- 支持取消操作和暂停操作的Backgroundworker
- 支持取消操作和暂停操作的Backgroundworker
- 支持暂停和继续操作的WAV音频播放
- c# BackGroundWorker 多线程操作的小例子
- c# BackGroundWorker 多线程操作的小例子
- c# BackGroundWorker 多线程操作的小例子
- c# BackGroundWorker 多线程操作的小例子
- c# BackGroundWorker 多线程操作的小例子
- c# BackGroundWorker 多线程操作的小例子
- c# BackGroundWorker 多线程操作的小例子
- c# BackGroundWorker 多线程操作的小例子
- BackgroundWorker 实现多线程操作
- c# BackGroundWorker 多线程操作
- iOS开发—线程的模拟暂停和继续操作
- C#多线程操作控件的两种安全方式(委托方式和BackgroundWorker控件方式)
- Populating Next Right Pointers in Each Node(leetcode)
- 给Linux初学者和管理员一个终极命令行"备忘单"
- JS获取字符串实际长度!
- Spark 4
- Spark--5
- 支持取消操作和暂停操作的Backgroundworker示例一则
- 弹出UIDateicker
- Ubunt 14.04 lts 安装 workbench及相关错误解决
- 冯永昌:云计算与大数据时代的量化投资
- 关于hibernate中多对多关系
- sendBroadcastAsUser——Calling a method in the system process without a qualified user
- 多线程之线程范围内的数据共享ThreadLocal
- 2014 随机型值点间的插值轨迹规划研究(聂宸) 读后感
- 使用SIPP来进行SIP压力测试(一)