WinForm中进行复杂的操作往往会导致界面假死,这种情况一般用户往往会再点几下o(︶︿︶)o。更好的方法是实现界面操作与后台操作的异步方式,当然使用多线程也可以,这里介绍的是.net framework中提供的自带控件BackgroundWorker。它就是实现界面操作与后台操作异步执行的控件,它的主要原理是创建两个或两个以上的线程,其中界面类为主线程,其他为辅助线程,也就是后台纯种,它可以在主线程与辅助线程中实现通讯,这样就实现了后台操作进度随时反应给用户知道。

其主要属性有两个, 一是WorkReportsProgress,代表状态改变是否报告进度,我们安装软件中常见的进度度就可以由它来控制。二是WorkSupportsCancel,代表线程是否支持取消,如果不支持的话,那只有一直等待程序运行结束了。

其事件主要有三个:DoWork为最主要的事件,所进行的操作也就在这里执行;ProgressChanged代表辅助线程发生改变时执行的事件,一般进度条就是在这里改变的;RunWorkerCompleted代表辅助线程执行完成进行的操作。

启动线程使用RunWorkerAsync方法。

/// <summary>
/// 点击
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnRun_Click(object sender, EventArgs e)
{if (backgroundWorker.IsBusy){MessageBox.Show("程序正忙,请耐心等待", "运行提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}else{backgroundWorker.RunWorkerAsync(textUrl.Text);}
}
/// <summary>
/// 主程序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{BackgroundWorker bw = (BackgroundWorker)sender;string url = e.Argument.ToString();for (int i = 0; i < 10; i++){if (!bw.CancellationPending){webBrowser.Url =new Uri( url);Thread.Sleep(1000);bw.ReportProgress(i * 100 / 10, i);}}
}
/// <summary>
/// 状态改变
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{progressBar.Value = e.ProgressPercentage;lblStatus.Text ="第" + e.UserState.ToString() + "次运行";
}
/// <summary>
/// 结束
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{lblStatus.Text = "程序运行结束";
}

源码下载

转载于:https://www.cnblogs.com/walkingp/archive/2011/01/11/1933357.html

BackgroundWorker的使用相关推荐

  1. C# BackgroundWorker 详解

    C# BackgroundWorker 详解 在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启 ...

  2. 黄聪:BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)...

    在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选.这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作 ...

  3. 如果在BackgroundWorker运行过程中关闭窗体…

    在Windows Form应用中,BackgroundWorker 类允许您在单独的专用线程上运行操作.耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态 ...

  4. C#中的BackgroundWorker控件

    Keywords: C# .NET BackgroundWorker Source: http://txw1958.cnblogs.com/ BackgroundWorker是.NET Framewo ...

  5. .net 2.0 BackgroundWorker类详细用法

    在WinForm中经常遇到一些费时的操作界面,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成"假死"的情况,或者报"线程间操作无 ...

  6. 支持取消操作和暂停操作的Backgroundworker

    这也是今天讨论的话题.取消是默认就支持的,而暂停则默认不支持.但通过ManualResetEvent可以对其进行干预. using System; using System.Collections.G ...

  7. c# BackgroundWorker组件介绍(属性、方法、事件)

    c# BackgroundWorker组件介绍(属性.方法.事件) 2008-07-03 16:28 在VS2005中添加了BackgroundWorker组件,该组件在多线程编程方面使用起来非常方便 ...

  8. C#在后台运行操作:BackgroundWorker的用法

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

  9. C#遍历文件读取Word内容以及使用BackgroundWorker对象打造平滑进度条

    本文将给出一个实例用于介绍如何利用C#遍历目录中的文件并打印Word文件中的内容,同时在界面上利用一个相对平滑的进度条来显示文件处理的情况.下面是程序运行时的截图: 下面来看看程序的具体实现步骤. 首 ...

  10. Winform中设置BackgroundWorker在取消时关闭后台进程不生效-没有跳出循环

    场景 Winform中设置BackgroundWorker在取消时关闭后台进程: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...

最新文章

  1. 用了 Lambda 之后,发现可以忘记设计模式了
  2. 设计模式之美:Memento(备忘录)
  3. 九零后程序员心塞大哭:“我累的心脏疼,父母却说我工作很轻松”
  4. (一个)AngularJS获取贴纸Hello World
  5. [JavaScript] 多数前端工程师都没注意到的一个关于console.log()的坑
  6. workflow initialization in webclient ui - Remote call case
  7. 【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度
  8. Let‘s Encrypt 免费Https证书
  9. 跟我一起学Oracle 11g【1】----基础回顾
  10. c语言的数据有常量与,C语言数据与常量.ppt
  11. 安装PyQt5安装包或者其他操作,报错Failed to execute script pyi_rth_multiprocessing,解决办法
  12. 航空公司VIP客户查询
  13. vs2010格式化html,VS中的快捷键快速格式化代码,使好看,整齐
  14. 单纯形法算法实现--java版
  15. 练习HTML——简单的网页设计
  16. 最新阿里云服务器和GPU服务器长期优惠活动价格表
  17. HTML:使用单选框、复选框,让用户选择
  18. javaweb JAVA JSP汽车配件销售系统jsp配件销售网站 (jsp电子商务系统,购物商城)在线购物案例
  19. 我和 TiDB 的故事 | 缘份在,那就终是能相遇的
  20. NVMe Driver 需要装吗_家里已经安装了断桥铝门窗,还需要装纱窗吗?为什么?

热门文章

  1. clickhouse算术函数
  2. 【CentOS 7笔记43】,防火墙和iptables filter表#
  3. TensorFlow从入门到理解(六):可视化梯度下降
  4. 实验报告四 201521430002 张实
  5. 《实施Cisco统一通信管理器(CIPT1)》一2.7 总结
  6. SpringBoot+MyBatis启动报错java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal
  7. 关于 WCF Binding 中 OpenTimeout, CloseTimeout, SendTimeout, ReceiveTimeout 的解释
  8. PHP设计模式——原型模式
  9. kubernetes session回话保持
  10. 车站分级 (2013noip普及组T4)(树形DP)