C#多线程之BackgroundWorker

2023-12-23 12:18

本文主要是介绍C#多线程之BackgroundWorker,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/528007

相关文章

C#中checked关键字的使用小结

《C#中checked关键字的使用小结》本文主要介绍了C#中checked关键字的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录✅ 为什么需要checked? 问题:整数溢出是“静默China编程”的(默认)checked的三种用

C#中预处理器指令的使用小结

《C#中预处理器指令的使用小结》本文主要介绍了C#中预处理器指令的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 第 1 名:#if/#else/#elif/#endif✅用途:条件编译(绝对最常用!) 典型场景: 示例

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

C#如何在Excel文档中获取分页信息

《C#如何在Excel文档中获取分页信息》在日常工作中,我们经常需要处理大量的Excel数据,本文将深入探讨如何利用Spire.XLSfor.NET,高效准确地获取Excel文档中的分页信息,包括水平... 目录理解Excel中的分页机制借助 Spire.XLS for .NET 获取分页信息为什么选择 S

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

在C#中分离饼图的某个区域的操作指南

《在C#中分离饼图的某个区域的操作指南》在处理Excel饼图时,我们可能需要将饼图的各个部分分离出来,以使它们更加醒目,Spire.XLS提供了Series.DataFormat.Percent属性,... 目录引言如何设置饼图各分片之间分离宽度的代码示例:从整个饼图中分离单个分片的代码示例:引言在处理

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C# 预处理指令(# 指令)的具体使用

《C#预处理指令(#指令)的具体使用》本文主要介绍了C#预处理指令(#指令)的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1、预处理指令的本质2、条件编译指令2.1 #define 和 #undef2.2 #if, #el

C#实现将Excel工作表拆分为多个窗格

《C#实现将Excel工作表拆分为多个窗格》在日常工作中,我们经常需要处理包含大量数据的Excel文件,本文将深入探讨如何在C#中利用强大的Spire.XLSfor.NET自动化实现Excel工作表的... 目录为什么需要拆分 Excel 窗格借助 Spire.XLS for .NET 实现冻结窗格(Fro