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

时间: 2024-11-09 02:38:28

C# Backgroundworker(后台线程)的使用的相关文章

使用后台线程BackgroundWorker处理任务的总结

在一些耗时的操作过程中,在长时间运行时可能会导致用户界面 (UI) 处于停止响应状态,用户在这操作期间无法进行其他的操作,为了不使UI层处于停止响应状态,我们倾向推荐用户使用BackgroundWorker来进行处理,这个后台的线程处理,可以很好的实现常规操作的同时,还可以及时通知UI,包括当前处理信息和进度等,这个BackgroundWorker的处理在百度里面也是有很多使用的介绍,本篇随笔主要是做一些自己的使用总结,希望也能给读者提供一个参考. 在使用BackgroundWorker的过程中

BackgroundWorker与线程使用

在一个程序中,一些耗时的操作,在长时间运行时可能会导致用户界面 (UI) 处于停止响应状态,用户在这操作期间无法进行其他的操作,为了不使UI层处于停止响应状态,需要将这些耗时的操作,设置为后台线程,并且在UI层可以展示后台操作的进度,比较常用的方法有使用线程以及BackgroundWorker类. 1.线程方法 当我们要在前太展示后台的操作进程时,是不允许跨线程访问控件.此时需要取消控件的跨线程访问,在winform中可以设置CheckForIllegalCrossThreadCalls = f

后台线程,优先级,sleep,yield

1.后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可获取的部分.当所有非后台线程结束时,程序也就 终止了,同时会杀死进程中所有后台线程.main()是一个非后台线程 设置后台线程:必须在启动线程之前调用setDaemon(true) 2.通过setPriority修改优先级,注意,优先级较低的线程仅仅是执行的频率较低 3.yield让步,例如,当你的工作已经做完,可以让其他的线程使用cpu,通过调用yield()方法.当调用此方法时,也只是在建议具有相同

后台线程(守护线程)

有一种线程,它是在后台运行的,它的任务是为其他的线程提供服务,这种线程被称为“后台线程”(Daemon Thread),又称为“守护线程”. 典型的后台线程是定时器”Timer"线程,他负责将固定的时间间隔发送给其他的线程. 后台线程经常用于任务结束时的善后处理.另外,后台线程的优先级要比其他的线程优先级低. 和后台线程相比,一般的线程称为“用户线程”.如果一个应用中只有后台线程在运行,JVM将退出该应用程序. 可以通过setDaemon(boolean d)来将一个普通的线程设置为后台线程.用

java 线程返回值,优先级,后台线程 示例代码

ava 线程返回值,休眠,优先级,后台线程  示例代码 package org.rui.thread.basic; import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Execu

InnoDB存储引擎——后台线程

1.InnoDB存储引擎概述 InnoDB存储引擎是第一个完整支持ACID事务的MySql存储引擎,其特点是行锁设计.支持MVCC.支持外键.提供一致性非锁定读,同时被设计用来最有效地利用以及使用CPU和内存. 2.InnoDB体系结构 上图是InnoDB存储引擎的体系结构,可以看到InnoDB存储引擎有很多内存块,这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构: 缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存. 重做日志

C#前台线程与后台线程的区别和联系 (转)

.Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程.这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出:而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束. .net环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=false,在进程中,只要有一个前台线程未退出,进程就不会终止.主线程就是一个前台线程.而后台线程不管

winform 后台线程更新UI

//后台线程更新TextBox private void SetTextBox(TextBox txt, string value) { Action act = () => { txt.Text = value; }; if (txt.InvokeRequired) { txt.Invoke(act); } else { act(); } } private void TestThread() { int i = 0; while (true) { Thread.Sleep(1000); i+

MySQL InnoDB后台线程threads详解

master thread 核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新.合并插入缓冲.undo页的回收等.Master thread在主循环中,分两大部分操作,每秒钟的操作和每10秒钟的操作:每秒一次的操作包括:1.日志缓冲刷新到磁盘,即使这个事务还没有提交(总是),这点解释了为什么再大的事务commit时都很快:2.合并插入缓冲(可能),合并插入并不是每秒都发生,InnoDB会判断当前一秒内发生的IO次数是否小于5,如果是,则系统认为当前的IO压力

InnoDB的后台线程和内存

InnoDB有多个内存块,你可以认为这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构. 缓存磁盘上的数据,方便快速地读取,并且在对磁盘文件的数据进行修改之前在这里缓存. 重做日志(redo log)缓冲. .......... 后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据.此外,将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常情况下InnoDB能恢复到正常运行状态. 后台线程 由于Oracle是多进程的架构