c# BackgroundWorker的基本用法
来源:互联网 发布:淘宝安全中心官网 编辑:程序博客网 时间:2024/05/17 04:20
转自 http://blog.csdn.net/coolwxb/article/details/7388499
这也是今天讨论的话题。取消是默认就支持的,而暂停则默认不支持。但通过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 BackgroundWorkderPauseSample { public partial class MainForm : Form { BackgroundWorker worker = null; public MainForm() { InitializeComponent(); Load += new EventHandler(Form1_Load); } void Form1_Load(object sender, EventArgs e) { worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.WorkerSupportsCancellation = true; worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); } void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; } void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) MessageBox.Show("用户取消了操作"); else { MessageBox.Show("正常完成了操作"); } } void worker_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < 100; i++) { if (worker.CancellationPending)//如果用户申请取消 { for (int k = i; k >= 0; k--) { Thread.Sleep(10); worker.ReportProgress(k);//模拟一个回滚的效果 } e.Cancel = true; return; } //如果ManualResetEvent的初始化为终止状态(true),那么该方法将一直工作,直到收到Reset信号。然后,直到收到Set信号,就继续工作。 manualReset.WaitOne(); //反之亦然 Thread.Sleep(500); worker.ReportProgress(i+1); } } private void btStart_Click(object sender, EventArgs e) { worker.RunWorkerAsync(); } private void btCancel_Click(object sender, EventArgs e) { worker.CancelAsync(); } private ManualResetEvent manualReset = new ManualResetEvent(true); private void btPause_Click(object sender, EventArgs e) { if (btPause.Text == "暂停") { manualReset.Reset();//暂停当前线程的工作,发信号给waitOne方法,阻塞 btPause.Text = "继续"; } else { manualReset.Set();//继续某个线程的工作 btPause.Text = "暂停"; } } } }
这个程序运行的效果大致如下
一。正常状态
二。暂停状态
三。恢复状态
作为演示,代码比较简单,没有对worker的一些状态进行判断以及按钮相应的设置。仅供参考
0 0
- c# BackgroundWorker的基本用法
- BackgroundWorker 基本用法
- C#中BackgroundWorker的最简单用法
- C# winform backgroundWorker用法
- c#中关于backgroundWorker控件的用法 (转)
- [C#新手入门 四] Winform 多线程初步 BackgroundWorker的用法
- C#在后台运行操作:BackgroundWorker的用法
- C#在后台运行操作:BackgroundWorker的用法
- C# BackgroundWorker 的使用方法
- C# BackgroundWorker的使用
- C# BackgroundWorker的使用
- C# BackgroundWorker的使用
- C# BackgroundWorker的使用
- C# BackgroundWorker的使用
- C# BackgroundWorker的使用
- C# BackgroundWorker的使用
- C# BackgroundWorker的使用
- C# BackgroundWorker的使用
- 浅谈node.js RESTful API
- 理解Unity法线贴图的切线空间存储方式
- xutils3 数据库操作,根据指定的columns列查询数据
- Vue中如何引入远程JS文件?
- FreeRTOS系列第12篇---FreeRTOS任务应用函数
- c# BackgroundWorker的基本用法
- Leetcode题解
- Android获取文件夹路径 /data/data/
- 查看android apk的包名的几种方式
- Vue:计算属性computed
- Java并发编程(二)--线程池
- __initialize()和类的构造函数__construct()
- [译]Android Weekly 250期优秀库与代码
- Python工具-pdfkit