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#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建