使用异步Lambda表达式

到目前为止,本章只介绍了异步方法。但我们曾经说过,你还可以使用异步匿名方法和异步
Lambda表达式。这些构造尤其适合那些只有少量工作要做的事件处理程序。下面的代码片段将
一个表达式注册为一个按钮点击事件的事件处理程序。

startWorkButton.Click+=async (sender, e) =>
{//处理点击处理程序工作
};

下面用一个简短的WPF程序来展示其用法,下面为后台代码:

using System.Threading.Tasks;
using System.Windows;namespace AsyncLambda
{public partical class MainWindow:Window{public MainWindow(){InitializeComponent();startWorkButton.Click+=async(sender,e)=>{SetGuiValues(false,"Work Started");await DoSomeWork();SetGuiValues(true,"Work Finished");};}private void SetGuiValues(bool buttonEnabled,string status){startWorkButton.IsEnabled=buttonEnabled;workStartedTextBox.Text=status;}private Task DoSomeWork(){return Task.Delay(2500);}}
}

XAML文件中的标记如下:

<Window x:Class="AsyncLambda.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  Title="Async lambda" Height="115" Width="150"> <StackPanel> <TextBlock Name="workStartedTextBlock" Margin="10,10"/> <Button Name="startWorkButton" Width="100" Margin="4" Content="Start Work" /> 
</StackPanel> 

图21-13展示了这段程序生成的窗体的三种状态。

AsyncLambda程序的输出结果

BackgroundWorker类

前面几节介绍了如何使用async/await特性来异步地处理任务。本节将学习另一种实现异步
工作的方式,即后台线程。async/await特性更适合那些需要在后台完成的不相关的小任务。

但有时候,你可能需要另建一个线程,在后台持续运行以完成某项工作,并不时地与主线程
通信。BackgroundWorker类就是为此而生的。图21-15展示了该类的主要成员。

## **BackgroundWorker类主要成员** 
- 属性 - WorkerReportsProgress(R/W) - WorkerSupportsCancellation(R/W) - IsBusy(R) - CancellationPending(R) 
- 方法 - RunWorkerAsync() - CancelAsync() - ReportProgress() 
- 事件 - DoWork - ProgressChanged - RunWorkerCompleted 
- 图标说明(补充) - R:Read - R/W:Read/Write - Event:事件标识 - 带阴影块:Called from Worker 
  • 图中的前两个属性用于设置后台任务是否可以把它的进度汇报给主线程以及是否支持从
    主线程取消。可以用第三个属性来检查后台任务是否正在运行。

  • 类有3个事件,用于发送不同的程序事件和状态。你需要写这些事件的事件处理方法来
    执行适合程序的行为。

    • 在后台线程开始的时候触发Do№工k。
    • 在后台任务汇报进度的时候触发ProgressChanged事件。
    • 在后台工作线程退出的时候触发RunWorkerComp1eted事件。
  • 三个方法用于开始行为或改变状态。

    • 调用RunWorkerAsync方法获取后台线程并且执行DoWork事件处理程序。
    • 用CancelAsync方法把CancellationPending属性设置为true。DoWork事件处理程序
      需要检查这个属性来决定是否应该停止处理。
    • DoWork事件处理程序(在后台线程)在希望向主线程汇报进度的时候,调用ReportProgress
      方法。
      要使用BackgroundWorker类对象,需要写如下的事件处理程序。第一个是必需的,因为它包
      含你希望在后台线程执行的代码。另外两个是可选的,是否使用取决于程序需要。
  • 附加到DoWork事件的处理程序包含你希望在后台独立线程上执行的代码。
    在图21·16中,叫作DoTheWork的处哩程序用渐变的方块表示,表明它在后台线程中执行。

    • 主线程调用BackgroundWorker对象的RunWorkerAsync方法的时候会触发DoWork事件。
  • 这个后台线程通过调用ReportProgress方法与主线程通信。届时将触发ProgressChanged
    事件,主线程可以用附加到ProgressChanged事件上的处理程序处理事件。

  • 附加到RunWorkerComp1eted事件的处理程序应该包含在后台线程完成DoWork事件处理程
    序的执行之后需要执行的代码。
    图21-16演示了程序的结构,以及附加到对象事件的事件处理程序。

你的代码提供了控制任务执行流程的一些事件的事件处理程序

这些事件处理程序的委托如下。每一个任务都接受一个object对象的引用作为第一个参数,
以及EventArgs类的特定子类作为第二个参数。

void DoWorkEventhandler(object sender,DoWorkEventArge e)void ProgressChangedEventHandler(object sender,ProgressChangedEventArgs e)void RunWorkerCompletedEventHandler(object sender,RunWorkerCompletedEventArgs e)

BackgroundWorker事件处理程序使用的EventArg类

如果你编写了事件处理程序并将其附加到相应的事件,就可以使用这个类。

  • 从创建BackgroundWorker类的对象并且对它进行配置开始。
    • 如果希望工作线程向主线程汇报进度,需要把WorkerReportsProgress属性设置为true。
    • 如果希望从主线程取消工作线程,就把workersupportscancellation属性设置为trueo
  • 既然对象已经配置好了,就可以通过调用RunWorkerAsync方法来启动它。这会获取一个
    后台线程,触发Dowork事件并在后台执行事件处理程序。
    现在我们已经运行了主线程以及后台线程。尽管后台线程正在运行,你仍然可以继续主线程
    上的处理。

在主线程中,如果你已经启用了workersupportscancellation属性,就可以调用对象的CancelAsync
方法。和本章开头介绍的CancellationToke一样,它也不会取消后台线程,而是将对象的
CancellationPending属性设置为true。在后台线程中运行的DoWork事件处理程序代码需要定期
检查CancellationPending属性,来判断是否需要退出。
同时,后台线程继续执行其计算任务,并且做以下几件事情。

  • 如果WorkerReportsProgress属性是true并且后台线程需要向主线程汇报进度的话,它必
    须调用Backgroundldorker对象的ReportProgress方法。这会触发主线程的ProgressChanged
    事件,从而运行相应的事件处理程序。
  • 如果workersupportscancellation属性启用的话,DoWork事件处理程序代码应该定期检
    查CancellationPending属性来确定它是否已经取消了。如果是的话,则它应该退出。
  • 如果后台线程没有取消,而是完成了其处理的话,可以通过设置DoWorkEventArgs参数的
    Result字段来返回结果给主线程,如图21-17所示。
    在后台线程退出的时候会触发RunWorkerCompleted事件,其事件处理程序在主线程上执行。
    RunWorkerCompletedEventArgs参数可以包含已完成后台线程的一些信息,比如返回值以及线程是
    否被取消了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92711.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92711.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92711.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S云原生监控方案Prometheus+grafana

目录 1. 概述 1.1 系统架构 1.1.1 架构图 ​编辑 1.2 环境准备 2. 部署prometheus 2.1 创建Namespace 2.2 创建ConfigMap资源 2.3 创建ServiceAccount&#xff0c;Clusterrole&#xff0c;Clusterrolebinding&#xff0c;Service&#xff0c;Deployment&#xff0c;in…

Matplotlib库:Python数据可视化的基石,发现它的美

Matplotlib是Python中最基础、最广泛使用的数据可视化库&#xff0c;它提供了类似MATLAB的绘图接口&#xff0c;能够创建高质量的静态、动态和交互式图表。作为科学计算和数据可视化的核心工具&#xff0c;Matplotlib几乎成为Python数据科学生态系统的标准可视化组件。 今天与…

每日算法刷题Day59:8.9:leetcode 队列8道题,用时2h30min

一、基础 1.套路 1.队列常用在 BFS 中&#xff0c;见 网格图题单 和 图论题单。 2.队列(queue)是容器适配器&#xff0c;功能较少。 队尾插入元素&#xff0c;队首弹出元素&#xff0c;可以访问队首元素、队尾元素和队列长度。 无begin(),end()等迭代器 queue<int> qu…

Java选手如何看待Golang

写在前面&#xff1a;翻了很多博客&#xff0c;一直没有Java选手转行golang的学习经验贴&#xff0c;思考很久&#xff0c;写下这篇Java选手怎么看待golang这个冉冉新星。1.走完所有golang基础之后的感受&#xff08;1&#xff09;最大的不适应有这么几点&#xff1a;---变量定…

Codeforces Round 967 (Div. 2) D. Longest Max Min Subsequence

假设我们要选a[j]为答案数组b[i]&#xff0c;从i从1~m&#xff08;m为a数组中不同数的个数&#xff09;建立一个suf数组&#xff0c;代表以i开头的后缀有多少个不同且在b[1~i-1]中未出现过的的个数&#xff0c;预处理suf&#xff0c;发现后续我们怎么选数改变suf&#xff0c;su…

Linux运维新手的修炼手扎之第27天

mysql服务1 主从复制集群&#xff1a;多主机集群【复制】负载过大解决方案&#xff1a;横向扩展[增加服务器节点分散负载]、纵向扩展[提升单机硬件性能]复制工作原理&#xff1a;前提&#xff1a;基础数据一样&#xff0c;主节点上有同步数据用的账号主角色【二进制日志、binlo…

【Linux】Linux增删改查命令大全(附频率评级)

Linux增删改查命令大全&#xff08;附频率评级&#xff09;* 《Linux命令全景手册&#xff1a;增删改查全场景解析&#xff08;含136个高频命令&#xff09;》 按使用频率★分级 | 测试/运维/开发均适用 | 附思维导图下载一、命令全景表&#xff08;增删改查频率评级&#xff0…

SwiftUI 登录页面键盘约束冲突与卡顿优化全攻略

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

建筑物实例分割数据集-9,700 张图片 城市规划与发展 灾害评估与应急响应 房地产市场分析 智慧城市管理 地理信息系统(GIS) 环境影响评估

建筑物实例分割数据集-9,700 张图片&#x1f4e6; 已发布目标检测数据集合集&#xff08;持续更新&#xff09;&#x1f3e2; 建筑物实例分割数据集介绍&#x1f4cc; 数据集概览包含类别&#x1f3af; 应用场景&#x1f5bc; 数据样本展示使用建议&#x1f31f; 数据集特色&am…

LeetCode 刷题【36. 有效的数独】

36. 有效的数独 自己做 解&#xff1a;多层for class Solution { public:bool isValidSudoku(vector<vector<char>>& board) {int hight board.size(); //长if (hight 0)return true;int wide board[0].size(); //宽//判断一行是否出现重复bool…

Java 日志从入门到精通:告别日志混乱

作为一名 Java 开发者&#xff0c;你是否曾在生产环境故障排查时面对过这样的困境&#xff1a;系统报错却找不到关键日志&#xff0c;日志文件大到无法打开&#xff0c;或者日志内容杂乱无章根本无法定位问题&#xff1f;日志作为系统运行的 “黑匣子”&#xff0c;其重要性不言…

系统开发 Day1

前端开发 目的&#xff1a; 开发一个平台&#xff08;网站&#xff09; - 前端开发&#xff1a;HTML CSS JavaScript - web框架&#xff1a;接受请求和处理 - MySQL数据库&#xff1a;存储数据的地方快速上手&#xff1a;基于Flask Web框架快速搭建一个网站 深度学习&#xff…

机器视觉任务(目标检测、实例分割、姿态估计、多目标跟踪、单目标跟踪、图像分类、单目深度估计)常用算法及公开数据集分享

本文按目标检测、实例分割、姿态估计、多目标跟踪、单目标跟踪、图像分类、单目深度估计七个任务分类&#xff0c;融合数据集介绍、评价指标及推荐算法&#xff0c;方便查阅&#xff1a; 一、目标检测 目标检测任务需定位图像中目标的边界框&#xff08;bounding box&#xff0…

MongoTemplate中setOnInsert与set方法的深度解析

MongoTemplate中setOnInsert与set方法的深度解析 在Spring Data MongoDB的MongoTemplate中&#xff0c;setOnInsert和set方法都是在更新文档时使用的&#xff0c;但它们在处理upsert操作&#xff08;即&#xff0c;如果文档不存在则插入&#xff0c;存在则更新&#xff09;时扮…

利用OJ判题的多语言优雅解耦方法深入体会模板方法模式、策略模式、工厂模式的妙用

在线评测系统&#xff08;Online Judge, OJ&#xff09;的核心是判题引擎&#xff0c;其关键挑战在于如何高效、安全且可扩展地支持多种编程语言。在博主的项目练习过程中&#xff0c;借鉴了相关设计模式实现一种架构设计方案&#xff0c;即通过组合运用模板方法、策略、工厂等…

[FOC电机控制]霍尔传感器于角度问题

如果电机有1对极(p1&#xff0c;那么每旋转一圈的机械角度&#xff0c;电气角度会转动一圈&#xff08;360&#xff09;。如果电机有2对极(p2&#xff0c;那么每旋转一圈的机械角度&#xff0c;电气角度会转动两圈&#xff08;720&#xff09;。

阿里云 Flink

阿里云 Flink 是阿里云基于Apache Flink打造的企业级实时计算平台&#xff0c;旨在为用户提供高效、稳定、易用的流处理与批处理能力&#xff0c;帮助企业快速构建实时数据处理链路&#xff0c;支撑实时业务决策。核心特性流批一体计算继承 Apache Flink “流批一体” 的核心优…

企业级高性能web服务器

1 web服务基础 1.1 正常情况的单次web服务访问流程&#xff1a; 正常情况下&#xff0c;单次 Web 服务访问流程从用户在客户端发起请求开始&#xff0c;到最终在客户端展示内容结束&#xff0c;涉及客户端、网络传输、服务器端等多个环节&#xff0c;以下是详细过程&#xff…

免费PDF编辑软件 pdf24-creator 及其安装包

最近发现了一款还算是不错的PDF编辑和阅读软件 pdf24-creator&#xff0c;官方下载网站为&#xff1a;https://tools.pdf24.org/zh/creator&#xff0c;但是官方下载如果没有魔法的话&#xff0c;下载速度很慢&#xff0c;比百度网盘下载还满&#xff0c;因此我把它分享到网盘。…

openvela之ADB

ADB&#xff08;Android Debug Bridge&#xff09;是一款功能丰富的命令行工具&#xff0c;旨在实现开发工作站与设备&#xff08;如模拟器、实体设备&#xff09;之间的通信。通过 ADB&#xff0c;开发者可以便捷地在设备上执行命令、传输文件、调试应用等。本文将详细介绍 AD…