博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
支持取消操作和暂停操作的Backgroundworker
阅读量:6722 次
发布时间:2019-06-25

本文共 2877 字,大约阅读时间需要 9 分钟。

这也是今天讨论的话题。取消是默认就支持的,而暂停则默认不支持。但通过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;                }                manualReset.WaitOne();//如果ManualResetEvent的初始化为终止状态(true),那么该方法将一直工作,直到收到Reset信号。然后,直到收到Set信号,就继续工作。                //反之亦然                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 = "暂停";            }        }    }}这个程序运行的效果大致如下一。正常状态image 二。暂停状态image三。恢复状态image作为演示,代码比较简单,没有对worker的一些状态进行判断以及按钮相应的设置。仅供参考

 

转载地址:http://klcmo.baihongyu.com/

你可能感兴趣的文章
抽象工厂模式(Abstract Factory)
查看>>
java 环境配置
查看>>
RHEL6.5安装MySQL8.0
查看>>
HDU1505 City Game(算竞进阶习题)
查看>>
0、安装Ionic2
查看>>
图片居中文字居左
查看>>
灵活的新窗口打开
查看>>
Python核心编程(第八章)--条件和循环
查看>>
原型模式
查看>>
webStorm activeCode
查看>>
虹软arcface人脸识别集成到项目中
查看>>
windows系统下,安装多个版本的jdk,java -version
查看>>
php 分页查询
查看>>
ubuntu 下命令行格式化 U盘 (转载)
查看>>
Java集合--TreeSet
查看>>
BurpSuite系列----Extender模块(扩展器)
查看>>
CSS media queries
查看>>
session的序列化、钝化、活化
查看>>
PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结...
查看>>
==与===的区别
查看>>