一、BackgroundWorker介绍

我们有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应。解决的方法就是新开一个线程,把耗时的操作放到线程中执行,这样就可以在用户界面上进行其它操作。新建线程可以用 Thread 类实现多线程同时操作。简单的方法可以通过 BackgroundWorker 类实现。BackgroundWorker是·net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。

  常用方法

  1.RunWorkerAsync 开始执行后台操作。引发 DoWork 事件

  2.CancelAsync 请求取消挂起的后台操作。

  注意:这个方法是将 CancellationPending 属性设置为 true,并不会终止后台操作。在后台操作中要检查

CancellationPending 属性,来决定是否要继续执行耗时的操作。

  3.ReportProgress引发 ProgressChanged 事件。

  常用属性

  1.CancellationPending 指示应用程序是否已请求取消后台操作。只读属性,默认为 false,当执行了 CancelAsync 方法后,值为 true。

  2.WorkerSupportsCancellation指示是否支持异步取消。要执行 CancelAsync 方法,需要先设置该属性为 true。

  3.WorkerReportsProgress指示是否能报告进度。要执行 ReportProgress 方法,需要先设置该属性为 true。

  常用事件

  1.DoWork 调用 RunWorkerAsync 方法时发生。

  2.RunWorkerCompleted后台操作已完成、被取消或引发异常时发生。

  3.ProgressChanged调用 ReportProgress 方法时发生。

二、实例

点击开始,出现动画,并计数。

xml

<Window x:Class="测试大数据的图表.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:测试大数据的图表"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid Name="grid1"><Button Content="开始" Height="23" HorizontalAlignment="Left" Margin="41,20,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /><Button Content="stop" Margin="165,18,543,377"  Click="Button_Click"/><DataGrid AutoGenerateColumns="False" Height="99" HorizontalAlignment="Left" Margin="40,70,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="441" /><Canvas Name="loading" RenderTransformOrigin="0.5,0.5" Visibility="Collapsed" HorizontalAlignment="Center" VerticalAlignment="Center" Width="120" Height="120" Margin="187,76,241,85"><Ellipse Width="15" Height="15" Canvas.Left="55" Canvas.Top="31" Stretch="Fill" Fill="#FFD1D1F7" Opacity="1.0"/><Ellipse Width="15" Height="15" Canvas.Left="38" Canvas.Top="39" Stretch="Fill" Fill="Blue" Opacity="0.8"/><Ellipse Width="15" Height="15" Canvas.Left="36" Canvas.Top="58" Stretch="Fill" Fill="#FF0000FE" Opacity="0.7"/><Ellipse Width="15" Height="15" Canvas.Left="52" Canvas.Top="67" Stretch="Fill" Fill="Blue" Opacity="0.6"/><Ellipse Width="15" Height="15" Canvas.Left="68" Canvas.Top="61" Stretch="Fill" Fill="#FF2E2EFF" Opacity="0.5"/><Ellipse Width="15" Height="15" Canvas.Left="69" Canvas.Top="42" Stretch="Fill" Fill="#FF6F6FFF" Opacity="0.4"/><Canvas.RenderTransform><RotateTransform x:Name="SpinnerRotate" Angle="0" /></Canvas.RenderTransform><Canvas.Triggers><EventTrigger RoutedEvent="ContentControl.Loaded"><BeginStoryboard><Storyboard><DoubleAnimation Storyboard.TargetName="SpinnerRotate" Storyboard.TargetProperty="(RotateTransform.Angle)" From="0" To="360" Duration="0:0:0.8" RepeatBehavior="Forever" /></Storyboard></BeginStoryboard></EventTrigger></Canvas.Triggers></Canvas><Label Name="lab_pro" Content="Label" Height="28" Margin="140,14,315,239" /></Grid>
</Window>

C#

using System;
using System.ComponentModel;
using System.Windows;namespace 测试大数据的图表
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}BackgroundWorker bgMeet = new BackgroundWorker();private void button1_Click(object sender, RoutedEventArgs e){if (bgMeet.IsBusy) // 防止重复执行异步操作引发错误return;bgMeet.WorkerReportsProgress = true;//报告完成进度  bgMeet.WorkerSupportsCancellation = true;//允许用户终止后台线程 bgMeet.DoWork += new DoWorkEventHandler(bgMeet_DoWork);bgMeet.ProgressChanged += new ProgressChangedEventHandler(bgMeet_ProgressChanged);bgMeet.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgMeet_RunWorkerCompleted);bgMeet.RunWorkerAsync();}/// <summary>/// 异步操作完成或中途终止会触发该事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void bgMeet_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){loading.Visibility = System.Windows.Visibility.Collapsed;this.Dispatcher.Invoke(new Action(() =>{this.lab_pro.Content = "完成";}));}/// <summary>/// 提供一个在 0 到 100 之间的整数,它表示后台活动已完成的百分比/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void bgMeet_ProgressChanged(object sender, ProgressChangedEventArgs e){this.Dispatcher.Invoke(new Action(() =>{this.lab_pro.Content = e.ProgressPercentage;}));}/// <summary>/// 开始异步操作执行该方法/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void bgMeet_DoWork(object sender, DoWorkEventArgs e){this.Dispatcher.Invoke(new Action(() =>{loading.Visibility = System.Windows.Visibility.Visible;}));for (int i = 0; i < 505; i++){if (bgMeet.CancellationPending){e.Cancel = true;return;}bgMeet.ReportProgress(i);System.Threading.Thread.Sleep(100);}}private void Button_Click(object sender, RoutedEventArgs e){if (bgMeet != null && bgMeet.WorkerSupportsCancellation == true){loading.Visibility = System.Windows.Visibility.Hidden; ;bgMeet.CancelAsync();//取消后台操作  bgMeet.Dispose();//释放资源  }}}}

参考:

https://www.cnblogs.com/javier520/p/10842161.html

https://www.cnblogs.com/zhaoshujie/p/9634136.html

https://blog.csdn.net/qq_33222460/article/details/79946847

C#多线程之BackgroundWorker相关推荐

  1. 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool

    [索引页] [源码下载] 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool 作者:webabcd 介绍 S ...

  2. Android多线程之ArrayBlockingQueue源码解析

    阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...

  3. Asp.Net Core 轻松学-多线程之Task快速上手

    Asp.Net Core 轻松学-多线程之Task快速上手 原文:Asp.Net Core 轻松学-多线程之Task快速上手 前言     Task是从 .NET Framework 4 开始引入的一 ...

  4. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  5. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach

    在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...

  6. Java多线程之Callable、Future和FutureTask

    Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...

  7. Java多线程之Synchronized和Lock的区别

    Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...

  8. Java多线程之CAS缺点

    Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...

  9. Java多线程之CAS深入解析

    Java多线程之CAS深入解析 目录: CAS是什么 CAS底层原理Unsafe深入解析 CAS缺点 引子:蚂蚁花呗一面:讲一讲AtomicInteger,为什么要用CAS而不是synchronize ...

最新文章

  1. Unity 2021创建2D休闲点击器游戏视频教程
  2. Docker实践(6)—CentOS7上部署Kubernetes
  3. BZOJ 4086: [Sdoi2015]travel(SDOI2015 round2 day1)(分类讨论+容斥原理)
  4. Java日志框架Slf4j+Log4j入门
  5. Java Selenium起步
  6. MAVEN构建的各个环节及常用maven命令
  7. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第5节 线程池_2_线程池的代码实现...
  8. 在mininet中测试TCP、UDP带宽并作图
  9. 使用latex分割与合成PDF
  10. 笔者分享:关于Win7 XPS查看器的详细介绍【386w】
  11. 计算机qq群怎样提交作业,qq群作业怎么弄 qq群作业功能详细介绍
  12. 打开计算机显示远程控制,win7系统远程协助怎么打开?开启远程协助功能教程...
  13. 如何添加BigBoss的Cydia源地址
  14. 管理感悟:今后公司工作的建议
  15. 关于AndEngine显示全屏问题
  16. python中base函数_详细的python basemap中各函数的所有参量注释
  17. 运用CNN对ImageNet进行图像分类
  18. 笔试题之——栈问题(列车车厢编组问题)
  19. Pybulle中确定UR机械臂末端姿态方法
  20. 打印设置自定义表尾_打印excel工作表时,如何把表头和表尾一起打印到每一页上?-excle怎样设置表尾打印...

热门文章

  1. 用C#实现文件下载器(1)
  2. 精通WORDPRESS设计与开发:第2章 代码概览
  3. repomd.xml parser error:Parse error at line: 14 (xmlParseEntityRef: no name
  4. MaoXian web clipper本地程序在macOS Catalina报错DisconnectErr:Native host has exited.
  5. c语言 多线程 传话,code vs1506传话(塔尖)+tarjan图文详解
  6. 解决火狐浏览器下载文件文件名乱码的问题
  7. 好嗨呦是谁_好嗨哦什么梗
  8. 复杂系统分析与设计思路
  9. 计算机应用程序在哪里打开,应用程序在哪,打开应用程序
  10. 骰子地下城简体中文破解版 v1.0绿色免安装版