zoukankan      html  css  js  c++  java
  • BackgroundWorker学习笔记

    1 简介

    BackgroundWorker 类允许您在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。 如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。

    2 使用BackgroundWork

    • 若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。 可以通过编程方式创建 BackgroundWorker,也可以将它从“工具箱”“组件”选项卡中拖到窗体上。 如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。
    • 若要为后台操作做好准备,请添加 DoWork 事件的事件处理程序。 在此事件处理程序中调用耗时的操作。
    • 若要开始此操作,请调用 RunWorkerAsync
    • 若要收到进度更新的通知,请处理 ProgressChanged 事件。
    • 若要在操作完成时收到通知,请处理 RunWorkerCompleted 事件。

    3 创建使用

               BackgroundWorker bw = new BackgroundWorker();//后台进程
               bw.DoWork += new DoWorkEventHandler(bw_DoWork);//bw_DoWork这里将执行一些耗时操作
               bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);//操作完成后执行的事件
               bw.RunWorkerAsync();//可以带参数,参数可选

              void bw_DoWork(object sender, DoWorkEventArgs e)
             {耗时操作,e是可选的事件参数}

    4 显示后台操作进度

        为了显示后台操作的执行进度,首先要使WorkerReportsProgress 等于true,然后调用BackgroundWorker的ReportProgress()方法,通过它传递操作完成的进度值,此外,该方法触发ProgressChanged事件,在是此事件中,通过ProgressChangedEventArgs的实例,接收到主线程传递过来的参数。
    BackgroundWorker backgroundWorker1 = new BackgroundWorker();
    backgroundWorker1.WorkerReportsProgress = true;
    private void btnStart_Click(object sender, EventArgs e) 
    
    { 
    
          backgroundWorker1.RunWokerAsync(); 
    
    } 
    
    private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e) 
    
    { 
    
          for (int i = 1; i < 11; i++) 
    
         { 
    
                  Thread.Sleep(2000); 
    
                 backgroundWorker1.ReportProgress(i*10); 
    
         } 
    
    } 
    
    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    { 
    
          //progressBar1是ProgressBar控件 
    
          progressBar1.Value = e.ProgressPercentage; 
    }

    5 取消后台操作

         为了使 BackgroundWorker 可以取消后台正在执行的操作,首先要把属性WorkerSupportsCancellation 的值设置为 true。接着调用CancelAsync()方法,该方法使得属性CancellationPending 为true,利用CancellationPending 属性,可以判断是否取消后台异步操作。

    BackgroundWorker backgroundWorker1 = new BackgroundWorker(); 
    
    backgroundWorker1.WorkerReportsProgress = true;
    
    
    backgroundWorker1.WorkerSupportsCancellation = true;

              

    private void btnCancel_Click(object sender, EventArgs e) 
    
    { 
    
          backgroundWorker1.CancelAsync(); 
    
    }
    if(backgroundWorker1.CancellationPending) 
    
     { 
    
        e.Cancel = true; 
    
         return; 
    
     }
  • 相关阅读:
    堆的实现(图片演示+文字讲解)
    数据结构之堆的插入、取值、排序(细致讲解+图片演示)
    插入排序
    (简单易懂)Java的快速失败(fail-fast)与安全失败,源码分析+详细讲解
    Eclipse安装Hibernate插件快速生成配置文件
    Hibernate级联操作解密(inverse和cascade)
    http协议详解
    javaweb中的关于编码问题总结
    Hyperparameter tuning
    win10修改jupyter notebook默认路径
  • 原文地址:https://www.cnblogs.com/fuchongjundream/p/3937181.html
Copyright © 2011-2022 走看看