• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

[转]c#支持取消操作和暂停操作的Backgroundworker

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

这也是今天讨论的话题。取消是默认就支持的,而暂停则默认不支持。但通过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 = "暂停";
            }
        }
    }
}
这个程序运行的效果大致如下
一。正常状态
 
二。暂停状态

三。恢复状态

作为演示,代码比较简单,没有对worker的一些状态进行判断以及按钮相应的设置。仅供参考

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Observer设计模式与C#委托、事件发布时间:2022-07-10
下一篇:
c#调试问题Dispose(bool)没有找到适合的方法来重写【搜藏】发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap