BackgroundWorker类使用参考

简介:

 BackgroundWorker是基于事件异步模式的一个实现。它具有以下特征:

 

可协调的退出

安全的更新窗体控件

转发异常到完成事件

报告进度

是一个控件,可以在visual studio中直接拖拽使用

由于BackgroundWorker是在线程池上运行,所有不能调用Abort()方法。

主要有3个事件,注意事件发生的时间

Public event DoWork 调用 RunWorkerAsync 时发生。
Public event ProgressChanged 调用 ReportProgress 时发生。
Public event RunWorkerCompleted 当后台操作已完成、被取消或引发异常时发生。

 当需要实现进度报告和取消操作时,务必设置下面两个属性

 

  backgroundWorker1.WorkerReportsProgress = true;
  backgroundWorker1.WorkerSupportsCancellation = true;
 
具体代码如下:

private void Form3_Load(object sender, EventArgs e)

        {

            backgroundWorker1.WorkerReportsProgress = true;

            backgroundWorker1.WorkerSupportsCancellation = true;

        }

 

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

        {

            for (int i = 0; i < progressBar1.Maximum; i++)

            {

                if (backgroundWorker1.CancellationPending)//每次循环检查取消状态

                {

                    e.Cancel = true;

                    return;

                }

 

                if (i > 78)

                    throw new Exception("error"); //抛出的异常会在completed事件中捕获

 

                //dothing();    //无论间接还是直接调用windowsUI控件,在调试状态时会引发异常,但是在执行时却不引发异常。

                Thread.Sleep(100);

 

                backgroundWorker1.ReportProgress(i);//更新状态。

 

            }

 

        }

 

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

        {

            progressBar1.Value++;//此处可以更新UI

            textBox1.AppendText("Call ProgressChanged:" + e.ProgressPercentage + ((BackgroundWorker)sender).IsBusy + "\r\n");

 

            throw new Exception("error in ProgressChanged"); //此处抛出的异常不会被completed事件捕获

 

        }

 

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

        {

            if (e.Cancelled)

                MessageBox.Show("You canceled!");

            else if (e.Error != null)

                MessageBox.Show("Worker exception: " + e.Error.Message);

            else

                MessageBox.Show("OK!");

        }

 

        private void btnStart_Click(object sender, EventArgs e)

        {

            backgroundWorker1.RunWorkerAsync();//执行该事件

        }

 

        private void btnCancel_Click(object sender, EventArgs e)

        {

            backgroundWorker1.CancelAsync();//取消

        }

 

        private void dothing()

        {

            textBox1.AppendText("-------------\r\n");

        }

            



















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/533207,如需转载请自行联系原作者



相关文章
|
6月前
|
XML JSON 前端开发
Qt委托代理机制之《Model/View/Delegate使用方法》
Qt委托代理机制之《Model/View/Delegate使用方法》
510 1
|
7月前
|
Java
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
|
数据采集 资源调度 安全
【JavaSE专栏77】线程的创建和启动,继承Thread类或实现Runnable接口完成线程创建启动
【JavaSE专栏77】线程的创建和启动,继承Thread类或实现Runnable接口完成线程创建启动
SwiftUI—如何使用@ObservedObject监听实例对象
SwiftUI—如何使用@ObservedObject监听实例对象
803 0
SwiftUI—如何使用@ObservedObject监听实例对象
|
C# 数据库 UED
C#之BackgroundWorker从简单入门到深入精通的用法总结
C#之BackgroundWorker从简单入门到深入精通的用法总结需求分析 经常用到的耗时操作,例如: 1、文件下载和上载(包括点对点应用程序传输文件,从网络下载文件、图像等)2、数据库事务(从数据库读到大量的数据到WinForm界面中的DataGridview里呈现)3、复杂的本地计算4、本地磁盘文件访问(读写文件,磁盘文件列表)…… 这些操作在长时间运行时会导致用户界面 (UI) 处于停止响应状态,用户在这操作期间无法进行其他的操作,造成非常差的用户体验,为了不使UI层处于停止响应状态,则可以使用 BackgroundWorker 类方便地解决这类问题。
1320 0
|
JavaScript
用接口实现事件的一种方法,只是玩玩。
  前一阵子,firelong说,应该用接口实现事件,而不应该用委托。我就希望他能给出一个用接口实现事件的方法,我是一直等呀,等到了现在也没有看到。     昨天又看到了,Snake@Net  说不要把接口和委托给混淆了的文章。
719 0
|
图形学
Unity 项目中委托Delegate用法案例
Unity中Delegate的用法场景 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) China...
1526 0
|
安全
BackgroundWorker 简单使用教程 多个线程的创建
原文:BackgroundWorker 简单使用教程 多个线程的创建 BackgroundWorker是一个非常不错的线程控件,能避免界面假死,让线程操作你想要做的事,它学习起来很简单,但是能实现很强大的功能。
864 0