C# BackgroundWorker

前言

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();
        }
    }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值