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

相关文章

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

MobaXterm远程登录工具功能与应用小结

《MobaXterm远程登录工具功能与应用小结》MobaXterm是一款功能强大的远程终端软件,主要支持SSH登录,拥有多种远程协议,实现跨平台访问,它包括多会话管理、本地命令行执行、图形化界面集成和... 目录1. 远程终端软件概述1.1 远程终端软件的定义与用途1.2 远程终端软件的关键特性2. 支持的

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学