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

相关文章

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

C#中的Converter的具体应用

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

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束