文章目录

    • @[TOC](文章目录
  • 前言
  • 介绍
  • 成员
  • 事件委托
  • 接口
  • 参数
  • 使用例程

前言

c# 日常学习记录


介绍

以下是百度百科的介绍:

BackgroundWorker是·net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题。

简而言之:就是.net将一个多线程的操作封装好了提供线程的接口给你用,简化了开发过程。


成员

该值指示应用程序是否已请求取消后台操作,当调用接口CancelAsyn后,可以通过该值来判断任务是否处理取消命令

public bool CancellationPending { get; }

当前线程执行状态

public bool IsBusy { get; }

进度报告使能开关

public bool WorkerReportsProgress { get; set; }

线程异步取消使能开关

public bool WorkerSupportsCancellation { get; set; }

事件委托

将需要执行的任务注册到该事件

public event DoWorkEventHandler DoWork;

将进度处理任务注册到该事件

public event ProgressChangedEventHandler ProgressChanged;

任务完成后的处理任务注册到该事件

public event RunWorkerCompletedEventHandler RunWorkerCompleted;

接口

取消线程:当该线程正在执行的时候,可调用该函数取消线程执行。

public void CancelAsync();

进度报告:调用该函数可向外报告当前执行进度,当然需要程序员传参。
percentProgress:当前进度
userState:当前执行状态(用户自定义使用)

public void ReportProgress(int percentProgress);
public void ReportProgress(int percentProgress, object userState);

开始执行:调用该函数开始执行线程任务。

public void RunWorkerAsync();

开始执行:调用该函数开始执行线程任务。
argument:传递给DoWork的参数

public void RunWorkerAsync();
public void RunWorkerAsync(object argument);

参数

Argument :调用 RunWorkerAsync(object argument) 函数启动任务传入的参数会被装载到DoWorkEventArgs 中,调用DoWorker的时候会传入

    public class DoWorkEventArgs : CancelEventArgs{public DoWorkEventArgs(object argument);[SRDescriptionAttribute("BackgroundWorker_DoWorkEventArgs_Argument")]public object Argument { get; }[SRDescriptionAttribute("BackgroundWorker_DoWorkEventArgs_Result")]public object Result { get; set; }}

ProgressPercentage :调用 ReportProgress 报告当前进度的时候
UserState :调用 ReportProgress(int percentProgress, object userState) 的时候可以自定义传入,触发 ProgressChanged 事件的时候传入 ProgressChangedEventArgs

    public class ProgressChangedEventArgs : EventArgs{public ProgressChangedEventArgs(int progressPercentage, object userState);[SRDescriptionAttribute("Async_ProgressChangedEventArgs_ProgressPercentage")]public int ProgressPercentage { get; }[SRDescriptionAttribute("Async_ProgressChangedEventArgs_UserState")]public object UserState { get; }}

使用例程

我在这里使用BackgroundWorker做了一个splash window。这里结合了Caliburn.micro框架。

public class SplashViewModel:Screen{private BackgroundWorker _worker;public SplashViewModel(){_worker = new BackgroundWorker();//打开异步取消功能_worker.WorkerSupportsCancellation = true;//打开进度报告功能_worker.WorkerReportsProgress = true;//注册执行完成任务_worker.RunWorkerCompleted += _worker_RunWorkerCompleted;//注册进度改变任务_worker.ProgressChanged += _worker_ProgressChanged;//注册执行的任务_worker.DoWork += _worker_DoWork;}private void _worker_DoWork(object sender, DoWorkEventArgs e){//报告对当前任务进度_worker.ReportProgress(0);//模拟耗时的任务操作Thread.Sleep(1000);var _startup = IoC.Get<IStartup>();_startup?.PreInitialize();_startup?.Initialize();Thread.Sleep(5000);_worker.ReportProgress(0);}private void _worker_ProgressChanged(object sender, ProgressChangedEventArgs e){//处理在执行进度,比如改变 processbar 的进度var _process = e.ProgressPercentage;}private void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){//任务结束后的操作this.TryCloseAsync();}protected override void OnViewReady(object view){base.OnViewReady(view);_worker.RunWorkerAsync();}}

C# 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. android 添加头参数,Retrofit添加header参数的几种方法
  2. AI人工智能的未来?AI科技与AI教程?答案都在这里!
  3. java xml中的冒号_Java jdom解析xml文件带冒号的属性
  4. 大数据下Limit使用(MySQL)
  5. 横线登记式明细分类账
  6. 2021年,Azure云遇到. NET5,注定开启高光时刻,微软的心,真大!
  7. Codeforces Round #356 (Div. 1) D. Bear and Chase 暴力
  8. 《完美软件》笔记8:如何应对防卫反应
  9. Java基础:如何向控制台写输出
  10. easyui首页模板
  11. 计算机考试反思1000,高一期中考试反思1000字,高一学生期中考试总结
  12. Koo叔说Shader-- 熟悉渲染管线
  13. D4:非成对图像去雾,基于密度与深度分解的自增强方法(CVPR 2022)
  14. Fullcalendar 日历控件的基本使用
  15. Unity3d打地鼠
  16. Redis-6.2.x版本官方发行说明(附谷歌翻译)【持续更新】
  17. 使用ssh正向连接、反向连接、做socks代理的方法
  18. 用python把学习通导出成绩,未完善
  19. sql server 验证身份证号码有效性
  20. word 公式编辑器 右对齐 + 自动编号

热门文章

  1. 环评图件制作业务承接(生态影响评价)
  2. tkinter GUI 客户端页面编程 登录注册案例开发
  3. php电竞酒店系统,星云电竞酒店管理系统
  4. 微信公众号开发——java后台开发(一)
  5. 薛定谔 Maestro教程--用户界面 | 结构编辑 | 测量距离角度
  6. 万能工具,完全免费实现各种超实用功能
  7. 用友软件反结账,反记账以及删除凭证操作流程
  8. 计算机专业个人职业规划范文200字,计算机专业的职业生涯规划范文
  9. SiamFC论文理解及代码理解
  10. 64位数开根号c语言,平方根的C语言实现(三) ——最终程序实现