微软提供了一个快捷使用多线程的帮助类BackgroundWorker,能够快速创建一个新的线程,并能报告进度,暂停,以及在线程完成后处理别的任务。

1.BackgroundWorker类介绍

     1.1. 四个常用属性:

      public bool IsBusy { get; }    //只读属性,用来判断当前线程是否正在工作中

    public bool WorkerReportsProgress { get; set; }   //决定当前线程是否能报告进度

    public bool WorkerSupportsCancellation { get; set; }   //决定当前线程能否取消

           public bool CancellationPending { get; }    //只读属性,用来判断是否发送了取消线程的消息(当调用CancelAsync()方法时,被设置为true)

     1.2. 三个常用事件:

    public event DoWorkEventHandler DoWork; //开始 必须,线程的主要逻辑,调用RunWorkerAsync()时触发该事件

    public event ProgressChangedEventHandler ProgressChanged; //报告 可选,报告进度事件,调用ReportProgress()时触发该事件

    public event RunWorkerCompletedEventHandler RunWorkerCompleted; //结束 可选,当线程运行完毕、发生异常和调用CancelAsync()方法这三种方式都会触发该事件

      1.3. 三个常用方法:

    public void RunWorkerAsync(); //启动线程,触发DoWork事件
    public void RunWorkerAsync(object argument);

    public void ReportProgress(int percentProgress); //报告进度,触发ProgressChanged事件
    public void ReportProgress(int percentProgress, object userState);

    public void CancelAsync(); //取消线程,将CancellationPending设置为true

2.BackgroundWorker用法

       2.1. 简单用法:

             新建BackgroundWorder对象;

             根据需求, 设置是否能取消(WorkerSupportsCancellation)、是否报告进度(WorkerReportsProgress);

             根据需求,设置好相关事件,DoWorker、ProgressChanged、ProgressChanged;

             调用RunWorkerAsyns()方法,启动线程;

             在需要取消的位置,判断CancellationPending的值,并做相关处理;//可选

             在适当的位置调用ReportProgress(int percentProgress)方法,报告进度。

        2.2.简单例子:

               2.2.1. 最基本的运行代码

                 BackgroundWorker简单实用(简便的异步操作)

                 界面的简单代码:

                        界面上就一个Grid控件和2个Button

 1 <Window x:Class="BackgroundWorkerDemo20170324.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         Title="MainWindow" Height="342" Width="504">
 5     <Grid>
 6         <ProgressBar x:Name="pBar" Margin="50,69,43,209">
 7         </ProgressBar>
 8         <Button x:Name="btnStart" Content="start" Click="btnStart_Click" Margin="50,218,311,63"/>
 9         <Button x:Name="btnCancel" Content="cancel" Click="btnCancel_Click" Margin="285,218,95,63"/>
10     </Grid>
11 </Window>
View Code

相关文章: