C# BackgroundWorker
文章目录
- @[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相关推荐
- C# BackgroundWorker 详解
C# BackgroundWorker 详解 在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启 ...
- 黄聪:BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)...
在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选.这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作 ...
- 如果在BackgroundWorker运行过程中关闭窗体…
在Windows Form应用中,BackgroundWorker 类允许您在单独的专用线程上运行操作.耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态 ...
- C#中的BackgroundWorker控件
Keywords: C# .NET BackgroundWorker Source: http://txw1958.cnblogs.com/ BackgroundWorker是.NET Framewo ...
- .net 2.0 BackgroundWorker类详细用法
在WinForm中经常遇到一些费时的操作界面,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成"假死"的情况,或者报"线程间操作无 ...
- 支持取消操作和暂停操作的Backgroundworker
这也是今天讨论的话题.取消是默认就支持的,而暂停则默认不支持.但通过ManualResetEvent可以对其进行干预. using System; using System.Collections.G ...
- c# BackgroundWorker组件介绍(属性、方法、事件)
c# BackgroundWorker组件介绍(属性.方法.事件) 2008-07-03 16:28 在VS2005中添加了BackgroundWorker组件,该组件在多线程编程方面使用起来非常方便 ...
- C#在后台运行操作:BackgroundWorker的用法
在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...
- C#遍历文件读取Word内容以及使用BackgroundWorker对象打造平滑进度条
本文将给出一个实例用于介绍如何利用C#遍历目录中的文件并打印Word文件中的内容,同时在界面上利用一个相对平滑的进度条来显示文件处理的情况.下面是程序运行时的截图: 下面来看看程序的具体实现步骤. 首 ...
- Winform中设置BackgroundWorker在取消时关闭后台进程不生效-没有跳出循环
场景 Winform中设置BackgroundWorker在取消时关闭后台进程: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...
最新文章
- android 添加头参数,Retrofit添加header参数的几种方法
- AI人工智能的未来?AI科技与AI教程?答案都在这里!
- java xml中的冒号_Java jdom解析xml文件带冒号的属性
- 大数据下Limit使用(MySQL)
- 横线登记式明细分类账
- 2021年,Azure云遇到. NET5,注定开启高光时刻,微软的心,真大!
- Codeforces Round #356 (Div. 1) D. Bear and Chase 暴力
- 《完美软件》笔记8:如何应对防卫反应
- Java基础:如何向控制台写输出
- easyui首页模板
- 计算机考试反思1000,高一期中考试反思1000字,高一学生期中考试总结
- Koo叔说Shader-- 熟悉渲染管线
- D4:非成对图像去雾,基于密度与深度分解的自增强方法(CVPR 2022)
- Fullcalendar 日历控件的基本使用
- Unity3d打地鼠
- Redis-6.2.x版本官方发行说明(附谷歌翻译)【持续更新】
- 使用ssh正向连接、反向连接、做socks代理的方法
- 用python把学习通导出成绩,未完善
- sql server 验证身份证号码有效性
- word 公式编辑器 右对齐 + 自动编号