zoukankan      html  css  js  c++  java
  • C# Backgroundworker(后台线程)的使用

    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 = "暂停";
                }
            }
        }
    }

  • 相关阅读:
    字符串类型
    mysql-schema-sync 实现 不同环境实例间表结构统一
    order by 运行过程
    MySQL 生成随机测试数据
    MySQL binlog 日志处理
    MySQL 查询优化
    使用 pyenv 管理不同的 Python 版本
    使用 pyenv 管理不同的 Python 版本
    MVC5 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭。
    在ASP.net MVC中利用ajax配合razor进行局部加载(给页面套好样式以后,一刷新就不合适了,终于找到了解决方案)
  • 原文地址:https://www.cnblogs.com/a849788087/p/5729122.html
Copyright © 2011-2022 走看看