前言
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();
}
}