C# BackgroundWorker控件使用方法

2023-11-18

在C# Winform开发中,若遇到大量数据操作或运算,通常UI界面卡死造成交互不良。

解决方法:1.使用BackgroundWorker控件;

                  2.使用多线程委托回调。

本章先介绍该控件使用方法。

界面展示:

若没使用该控件,点击开始,进度条会滚动但会造成界面卡死,体验不良。

步骤一:实例化BackgroundWorker。

private BackgroundWorker bgWorker = new BackgroundWorker();//实例化控件

 步骤二:窗体加载时设置属性。

private void Form1_Load(object sender, EventArgs e)
{
    //是否报告处理进度
    bgWorker.WorkerReportsProgress = true;
    //是否允许取消操作
    bgWorker.WorkerSupportsCancellation = true;
    //执行三个事件,DoWork事件,ProgressChanged事件以及RunWorkedCompleted事件
    bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
    bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged);
    bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);
}

   步骤三:DoWork事件,运算操作,注意不能有与控件的交互操作,跨线程调用控件(例如给控件赋值)。

public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
    //设置进度条Maximum为1000,循环1000次
    for (int i = 0; i <= 1000; i++)
    {
        //获取是否取消操作
        if (bgWorker.CancellationPending)
        {
            e.Cancel = true;
            return;
        }
        else
        {
            //报告进度
            bgWorker.ReportProgress(i, "Working");
            System.Threading.Thread.Sleep(10);
         }
    }
}

步骤四:ProgressChanged事件,可与控件进行交互,为进度条赋值。

public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e)
{
    //e.ProgressPercentage是获取任务进度百分比,int类型
    progressBar1.Value = e.ProgressPercentage;
    label1.Text = "处理进度:" + Convert.ToString(e.ProgressPercentage) + "%";
}

步骤五:RunWorkerCompleted事件,当DoWork事件结束时或取消时执行。

public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //若没有完全执行结束,则报错
    if (e.Error != null)
    {
        MessageBox.Show(e.Error.ToString());
        return;
    }
    if (!e.Cancelled)
        this.label1.Text = "处理完毕!";
    else
        this.label1.Text = "处理终止!";
}

开始与结束事件:

//开始
private void btnStart_Click(object sender, EventArgs e)
{
    //正忙时不允许继续操作
    if (bgWorker.IsBusy)
        return;
    //异步开启
    bgWorker.RunWorkerAsync("hello");
}

//停止
private void btnStop_Click(object sender, EventArgs e)
{
    bgWorker.CancelAsync();
}

点击开始时,进度条开始滚动,user此时可以拖动窗口或者key相关数据,UI界面不会卡死,体验良好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# BackgroundWorker控件使用方法 的相关文章

  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况

随机推荐

  • Kotlin - 文件类 File

    文件操作 遍历 walk 自上而下 深度优先 遍历整个文件夹 walkBottomUp 自下而上的顺序遍历文件目录和内容 walkTopDown 自上而下的顺序遍历文件目录和内容 名称 extension 文件名的后缀格式 不包含 例如 m
  • [激光原理与应用-45]:《焊接质量检测》-2- 常见焊接缺陷与检验方法

    目录 一 概述 二 焊接缺陷的分类 2 1 按产生原因 2 2 按性质分有 2 3 按在焊缝中的位置分有 三 焊接缺陷检验的常用方法 一 概述 对于一个金属结构来说 焊接检验就是对所有焊缝或焊接接头而言的 也就是对焊接缺陷的检验 但焊接接头
  • idea 编译成功启动失败

    环境 Windows10 IntelliJ IDEA 2021 2 3 Ultimate Edition Apache Maven 3 8 3 SpringBoot版本 2 1 13 RELEASE 问题描述 SpringBoot项目启动时
  • html输入浮点型,input框限定输入值为浮点型代码分享

    本文主要为大家带来一篇对于input 框限定输入值为浮点型的js代码 小编觉得挺不错的 现在就分享给大家 也给大家做个参考 一起跟随小编过来看看吧 希望能帮助到大家 在一些项目中 比如金额用到浮点型 对于input 限定可以参考以下 fun
  • 信创-大数据平台CPU架构支持

    一 CDH和HDP CDP CDP数据中心类似于CDH和HDP 直接安装在硬件服务器上 目前支持市面上主流的X86服务器 包括国内海光服务器 CDH不支持ARM 以上两种大数据平台都仅支持x86架构 早在几年期RedHat联手clouder
  • IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!)

    自动代码 常用的有fori sout psvm Tab即可生成循环 System out main方法等boilerplate样板代码 例如要输入for User user users 只需输入user for Tab 再比如 要输入Dat
  • SQL BOY 4 款脚本工具利器

    对于正在运行的mysql 性能如何 参数设置的是否合理 账号设置的是否存在安全隐患 你是否了然于胸 俗话说工欲善其事 必先利其器 定期对你的MYSQL数据库进行一个体检 是保证数据库安全运行的重要手段 今天和大家分享几个mysql 优化的工
  • Java多线程工具类之循环栅栏计数器

    Java多线程下循环计数器 本文主要内容 CyclicBarrier 下文中凯哥就用cycBar来代替 定义介绍 举例说明 代码演示 从源码来看原理及总结 CyclicBarrier与CountDownLatch 下文就用CountDown
  • 多分类SVM支持向量机的matlab仿真

    目录 一 理论基础 二 核心程序 三 仿真结论 一 理论基础 支持向量机 Support Vector Machine SVM 是一种在统计学习基础上发展起来的机器学习方法 其最大特点是根据Vapnik结构风险最小化原则 它的基本模型是定义
  • 从0到1:如何建立一个大规模多语言代码生成预训练模型

    国产AI辅助编程工具CodeGeeX是一个使用AI大模型为基座的辅助编程工具 帮助开发人员更快的编写代码 可以自动完成整个函数的编写 只需要根据注释或Tab按键即可 它已经在Java JavaScript和Python等二十多种语言上进行了
  • 判断机器大端小端的方法

    Big Endian和Little Endian的定义如下 1 Little Endian就是低位字节排放在内存的低地址端 高位字节排放在内存的高地址端 2 Big Endian就是高位字节排放在内存的低地址端 低位字节排放在内存的高地址端
  • DAC0832数模转换芯片介绍及使用教程

    1 芯片简介 DAC0832是采样频率为八位的D A转换芯片 集成电路内有两级输入寄存器 使DAC0832芯片具备双缓冲 单缓冲和直通三种输入方式 D A转换结果采用电流形式输出 若需要相应的模拟电压信号 可通过一个高输入阻抗的线性运算放大
  • Python小实验2—产生式系统实验

    文章目录 1 实验内容 2 实验目的 3 实验思路 4 源代码 5 实验结果 1 实验内容 设已知初始事实存放在综合数据库中 该动物身上有 暗斑点 长脖子 长腿 奶 蹄 推理机构的工作过程 1 从规则库中取出r 检查其前提是否可与综合数据库
  • QT之QChart绘制动态曲线

    QT之QChart绘制动态曲线 1 头文件 2 值写入QLineSeries 3 创建QChart对象 添加坐标轴 4 创建QChartView 5 QChartView显示到窗口 6 完整例子 QChart的系列 QChartSeries
  • 数据量太大,DOM节点加载过多,怎么保证前端在渲染的时候页面不会卡(性能优化)

    一 定时器分批渲染 既然一次渲染10万条数据会造成页面加载速度缓慢 那么我们可以不要一次性渲染这么多数据 而是分批次渲染 比如一次10000条 分10次来完成 这样或许会对页面的渲染速度有提升 然而 如果这13次操作在同一个代码执行流程中运
  • 苹果今天发布了 iOS 14.5 的第一个开发者预览版

    苹果今天发布了 iOS 14 5 的第一个开发者预览版 其中一个重要的新功能是 iPhone 12 机型在双 SIM 卡模式下对 5G 的全球支持 此前该功能仅在中国大陆地区提供 海外 iPhone 12 机型同时配备了物理 SIM 卡槽和
  • windows利用msys2安装minGW64

    目录 下载mysy2 配置国内源 安装minGW64 下载mysy2 官网下载非常慢 所以我们可以选择从清华大学的源下载 清华大学的msys2源说明 下载msys2 x86 64 20220603 exe 配置国内源 pacman 的配置
  • springboot启动feign项目报错:Service id not legal hostname

    正经学徒 佛系记录 不搞事情 在feign项目中 定义接口调用服务 FeignClient name eureka client public interface TestInterface GetMapping value get Str
  • 99款高质量免费(X)HTML/CSS模板

    99款高质量免费 X HTML CSS模板 01 T 20 在线预览下载该模板 02 Shape 在线预览下载该模板 03 Your Business 在线预览下载该模板 04 Solitude 在线预览下载该模板 05 Fashion C
  • C# BackgroundWorker控件使用方法

    在C Winform开发中 若遇到大量数据操作或运算 通常UI界面卡死造成交互不良 解决方法 1 使用BackgroundWorker控件 2 使用多线程委托回调 本章先介绍该控件使用方法 界面展示 若没使用该控件 点击开始 进度条会滚动但