c# BackgroundWorker的基本用法

转自 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的一些状态进行判断以及按钮相应的设置。仅供参考

猜你喜欢

转载自blog.csdn.net/zh_geo/article/details/68925558