BackgroundWorker应用实例

2024-04-02 19:08

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

本文通过实例介绍BackgroundWorker组件的使用方法。使用BackgroundWorker前需要添加命名空间System.ComponentModel。本实例模拟一个耗时操作,并在操作过程中报告工作进度。这种情况使用BackgroundWorker非常合适。下面是实例程序的主画面。

 

下面给出程序的完整代码。

using System.ComponentModel;
using System.Threading;
using System.Windows;namespace BackgroundWorkerExp
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{BackgroundWorker bw;public MainWindow(){InitializeComponent();bw = new BackgroundWorker();bw.WorkerSupportsCancellation = true;bw.WorkerReportsProgress = true;bw.DoWork += bw_DoWork;bw.ProgressChanged += bw_ProgressChanged;bw.RunWorkerCompleted += bw_RunWorkerCompleted;}private void Button_Start_Click(object sender, RoutedEventArgs e){bw.RunWorkerAsync();}void bw_DoWork(object sender, DoWorkEventArgs e){for (int i = 0; i < 100000; i++){if (i % 1000 == 0){bw.ReportProgress(i / 1000);Thread.Sleep(50);}}}void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){this.Label_CurrentProgress.Content = "操作完成";}void bw_ProgressChanged(object sender, ProgressChangedEventArgs e){this.Label_CurrentProgress.Content = e.ProgressPercentage + "%";}}
}

代码中在窗体被创建时,初始化BackgroundWorker,设置BackgroundWorker相关属性,注册BackgroundWorker相关事件,下面对代码中涉及到的属性和事件进行说明。

(1)WorkerSupportsCancellation属性:表示BackgroundWorker是否支持异步取消。当该属性设置为true时,可以调用异步方法CancelAsync来取消异步操作。

(2)WorkerReportsProgress属性:表示BackgroundWorker是否可以报告当前进度。当该属性设置为true时,可以调用ReportProgress方法来报告当前进度。

(3)DoWork事件:当调用RunWorkerAsync方法时,该事件被触发,在事件处理方法中执行耗时操作,此方法中的代码在子线程中执行,可看成使用Thread新起的一个线程。

(4)ProgressChanged事件:当调用ReportProgress方法时,该事件会被触发,在事件处理方法中可以更新画面显示当前执行进度,类似于使用BeginInvoke在子线程中刷新UI主画面的操作,这部分代码在主线程中执行。

(5)RunWorkerCompleted事件:当DoWork事件处理方法中所有代码执行完后触发该事件,该事件处理器中的代码也是在主线程中执行。

在开发中,不小心将调用RunWorkerAsync方法的代码放置在子线程的代码中。

        private void Button_Start_Click(object sender, RoutedEventArgs e){Thread t = new Thread(()=>ThreadMethod());t.Start();           }void ThreadMethod(){bw.RunWorkerAsync();} 

使用上面代码会在下面的代码中出现错误“调用线程无法访问此对象,因为另一个线程拥有该对象”。

        void bw_ProgressChanged(object sender, ProgressChangedEventArgs e){this.Label_CurrentProgress.Content = e.ProgressPercentage + "%";}
原因极其明显,代码“this.Label_CurrentProgress.Content = e.ProgressPercentage + "%";”只有在主线程中执行才能正常工作,因为Label_CurrentProgres的拥有者是主线程而不是某个子线程,在子线程直接操作UI主线程中的对象是不允许的。


这篇关于BackgroundWorker应用实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

线程池ThreadPoolExecutor应用过程

《线程池ThreadPoolExecutor应用过程》:本文主要介绍如何使用ThreadPoolExecutor创建线程池,包括其构造方法、常用方法、参数校验以及如何选择合适的拒绝策略,文章还讨论... 目录ThreadPoolExecutor构造说明及常用方法为什么强制要求使用ThreadPoolExec

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

Nginx服务器部署详细代码实例

《Nginx服务器部署详细代码实例》Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,:本文主要介绍Nginx服务器部署的相关资料,文中通过代码... 目录Nginx 服务器SSL/TLS 配置动态脚本反向代理总结Nginx 服务器Nginx是一个‌高性

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

springboot+mybatis一对多查询+懒加载实例

《springboot+mybatis一对多查询+懒加载实例》文章介绍了如何在SpringBoot和MyBatis中实现一对多查询的懒加载,通过配置MyBatis的`fetchType`属性,可以全局... 目录springboot+myBATis一对多查询+懒加载parent相关代码child 相关代码懒

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

C++中的解释器模式实例详解

《C++中的解释器模式实例详解》这篇文章总结了C++标准库中的算法分类,还介绍了sort和stable_sort的区别,以及remove和erase的结合使用,结合实例代码给大家介绍的非常详细,感兴趣... 目录1、非修改序列算法1.1 find 和 find_if1.2 count 和 count_if1

MySQL中如何求平均值常见实例(AVG函数详解)

《MySQL中如何求平均值常见实例(AVG函数详解)》MySQLavg()是一个聚合函数,用于返回各种记录中表达式的平均值,:本文主要介绍MySQL中用AVG函数如何求平均值的相关资料,文中通过代... 目录前言一、基本语法二、示例讲解1. 计算全表平均分2. 计算某门课程的平均分(例如:Math)三、结合

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个