标签:backgroundworker 取消 暂停
摘要: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(); } } }
支持取消操作和暂停操作的Backgroundworker示例一则
标签:backgroundworker 取消 暂停
原文地址:http://blog.csdn.net/fanrong1985/article/details/40921901