当前位置: 首页 > news >正文

C# BackGroundWorker控件演示代码

2010021512245097.gif

在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示元,必要进,还要控制后台线程中断当前操作。

以前,类似的应用会比较麻烦,需要写的代码较多,也很容易出现异常。在 .net中,提供了一个组件 backgroundworker就是专门解决这个问题的。

使用这个组件其实非常简单,例如,我们做一个类似如下界面的进度条的小例子,在后台线程中进行耗时运算,同时刷新界面上的滚动条和提示信息,运行结束后,弹出处理结果。

演示代码:

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;

namespace 多线程小例子
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

//这里就是通过响应消息,来处理界面的显示工作

        ******* void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;
            this.label1.Text = e.UserState.ToString();
            this.label1.Update();
        }

//这里是后台工作完成后的消息处理,可以在这里进行后续的处理工作。

        ******* void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("运算终于完成了");
        }

//这里,就是后台进程开始工作时,调用工作函数的地方。你可以把你现有的处理函数写在这儿。

        ******* void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            work(this.backgroundWorker1);
        }

//真正的处理工作

        ******* bool work(BackgroundWorker bk)
        {
            int tatle =10000;

            for (int i = 0; i < tatle; i++)
            {
                if (bk.CancellationPending) //这里判断一下是否用户要求取消后台进行,并可以尽早退出。
                {
                    bk.ReportProgress(i, String.Format("当前值是 {0},操作被用户申请中断", i));
                    return false;
                }

//处理的过程中,通过这个函数,向主线程报告处理进度,最好是折算成百分比,与外边的进度条的最大值必须要对应。这里,我没有折算,而是把界面线程的进度条最大值调整为与这里的总数一致。
                bk.ReportProgress(i, String.Format("当前值是 {0} ", i));
            }
            return true;
        }

        ******* void button2_Click(object sender, EventArgs e)
        {

//用户要求取消时,就这样处理一下。有时不太灵喔。

                this.backgroundWorker1.CancelAsync();
        }

        ******* void button1_Click(object sender, EventArgs e)
        {

//这一句,就是让后台工作开始。

            this.backgroundWorker1.RunWorkerAsync();
        }

        ******* void button3_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
 

 本例源代码下载

相关文章:

  • 面向接口编程详解(一)——思想基础
  • MSN登陆问题
  • CiSCO 交换机配置 SSH 登陆
  • 飞鸽传书文件传输实现原理
  • dedecms调用全站相关文章怎么设置
  • Golomb及指数哥伦布编码原理介绍及实现
  • @在php中起什么作用?
  • 2017.3.13笔记 this指向
  • 国内又出一个开源网店系统,值得期待...
  • ASP.NET页面解析(3)
  • 2.3 Junit 安装
  • 集成中国
  • JAVA之继承和多态
  • 剖析:为何很多人成了QQ隐身族[转载]
  • J2SE5.0中的注释特性
  • hexo+github搭建个人博客
  • avalon2.2的VM生成过程
  • ES6系统学习----从Apollo Client看解构赋值
  • Golang-长连接-状态推送
  • js递归,无限分级树形折叠菜单
  • Netty源码解析1-Buffer
  • nginx 配置多 域名 + 多 https
  • passportjs 源码分析
  • Python_OOP
  • RxJS: 简单入门
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 不上全站https的网站你们就等着被恶心死吧
  • 面试遇到的一些题
  • 让你的分享飞起来——极光推出社会化分享组件
  • 设计模式(12)迭代器模式(讲解+应用)
  • 携程小程序初体验
  • 新版博客前端前瞻
  • 学习HTTP相关知识笔记
  • 找一份好的前端工作,起点很重要
  • 整理一些计算机基础知识!
  • # .NET Framework中使用命名管道进行进程间通信
  • ###C语言程序设计-----C语言学习(3)#
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (2)Java 简介
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (超详细)语音信号处理之特征提取
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (转)程序员疫苗:代码注入
  • .libPaths()设置包加载目录
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 的程序集加载上下文
  • .Net(C#)自定义WinForm控件之小结篇
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /etc/fstab和/etc/mtab的区别
  • @AutoConfigurationPackage的使用
  • @property @synthesize @dynamic 及相关属性作用探究
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [C#]手把手教你打造Socket的TCP通讯连接(一)