C# Task 包含 await ConfigureAwait CancellationTokenSource
- `Task`
- 以下是 `Task` 类的一些关键特性和用法:
- 以下是一些使用 `Task` 的示例:
- 创建并启动一个任务
- 使用 `await` 等待任务完成
- 处理任务异常
- 使用 `Task<TResult>` 获取结果
- 取消任务
- 总结
- `await`
- 暂停方法执行:
- 非阻塞调用:
- 任务结果获取:
- 异常处理:
- 同步上下文恢复:
- 配置任务继续执行的线程:
- 组合异步操作:
- 简化异步编程:
- 下面是一个使用 `await` 的简单示例:
- `ConfigureAwait`
- 使用场景
- 语法
- 参数
- 示例
- 总结
- `CancellationTokenSource`
- 下面是一个使用 `CancellationTokenSource` 的示例:
- 总结
- 个人理解
- 例子如下
- 运行结果如下
Task
在C#
中,Task
是 System.Threading.Tasks
命名空间中的一个类,它代表了异步操作 的执行。Task
类是异步编程模型的核心,它允许开发者编写非阻塞的代码,提高应用程序的响应性和性能。
以下是 Task
类的一些关键特性和用法:
-
表示异步操作:
Task
表示一个可能已经完成、正在运行或尚未开始的异步操作。 -
返回值:
Task<TResult>
是Task
的泛型版本,它表示一个异步操作,该操作将返回一个指定类型的结果。 -
状态跟踪:
Task
对象提供了属性来跟踪其状态,如Status
、IsCompleted
、IsFaulted
等。 -
异常处理:如果异步操作中发生异常,
Task
对象的Exception
属性将包含异常信息。 -
等待完成:可以使用
await
关键字或Task.Wait()
、Task.Result
方法来等待Task
完成。 -
取消支持:
Task
支持使用CancellationToken
来取消操作。 -
连续性:可以使用
ContinueWith
方法来安排在任务完成后执行的连续任务。 -
并行执行:
Task
可以与其他任务并行执行,使用Task.WhenAll
或Task.WhenAny
来管理多个任务的完成。
以下是一些使用 Task
的示例:
创建并启动一个任务
// 创建并启动一个任务
Task task = Task.Run(() =>
{Console.WriteLine("Task is running on thread: " + Thread.CurrentThread.ManagedThreadId);
});
// 等待任务完成
task.Wait();
使用 await
等待任务完成
public async Task DoWorkAsync()
{await Task.Run(() => {// 模拟长时间运行的任务Thread.Sleep(1000);Console.WriteLine("Work is done.");});
}
处理任务异常
public async Task DoWorkWithExceptionAsync()
{try{await Task.Run(() => {throw new InvalidOperationException("Something went wrong!");});}catch (Exception ex){Console.WriteLine($"Caught an exception: {ex.Message}");}
}
使用 Task<TResult>
获取结果
public async Task<int> GetResultAsync()
{return await Task.Run(() => {// 模拟计算过程return 42;});
}
取消任务
public async Task CancelTaskAsync(CancellationToken cancellationToken)
{var task = Task.Run(() =>{while (!cancellationToken.IsCancellationRequested){// 模拟长时间运行的任务}}, cancellationToken);await Task.Delay(100); // 模拟一段时间后取消任务cancellationToken.Cancel();await task;
}
总结
Task
类是.NET
异步编程的基础,它提供了一种简单而强大的方式来编写和组织异步代码。
await
在 C#
中,await
关键字用于异步编程,它有几个关键作用:
暂停方法执行:
当编译器遇到一个
await
表达式时,它会暂停当前async
方法的执行,直到被await
的任务(Task
或Task<T>
)完成。
非阻塞调用:
await
允许程序在等待异步操作完成时继续执行其他代码。这意味着程序可以执行其他任务,而不是被阻塞等待异步操作的完成。
任务结果获取:
当 await
一个 Task<T>
时,它返回任务的结果。一旦任务完成,await
表达式的结果就是 Task<T>
的结果。
异常处理:
如果 await
的任务失败并抛出异常,异常会被传播到 await
调用的地方。如果 await
被包含在一个 try
块中,异常可以被捕获和处理。
同步上下文恢复:
await
表达式可以配置为在特定的同步上下文中继续执行(例如,UI
线程)。如果 await
表达式没有指定继续执行的上下文,它将恢复到调用它的原始上下文。
配置任务继续执行的线程:
使用 await
时,可以指定一个 TaskScheduler
,来决定任务完成后在哪个线程上继续执行。
组合异步操作:
await
可以与 async
一起使用,创建更复杂的异步工作流,如链式调用多个异步方法。
简化异步编程:
使用 await
和 async
可以大大简化异步代码的编写,使异步代码看起来和同步代码类似,更容易理解和维护。
下面是一个使用 await
的简单示例:
using System;
using System.Threading.Tasks;class Program
{static async Task Main(){int result = await GetNumberAfterDelayAsync();Console.WriteLine(result);}static async Task<int> GetNumberAfterDelayAsync(){await Task.Delay(1000); // 模拟异步操作,延迟1秒return 42; // 返回结果}
}
在这个示例中,Main
方法使用 await
等待 GetNumberAfterDelayAsync
方法完成,并获取它返回的整数结果。await
使得 Main
方法可以非阻塞地等待异步操作的完成。
ConfigureAwait
在C#
中,ConfigureAwait
是一个方法,用于配置 await
操作是否继续在原始的同步上下文上执行,或者是否继续在不同的上下文上执行。这通常在异步编程中使用,特别是在使用 Task
和 async
关键字时。
当你调用一个异步方法并使用 await
时,await
会返回一个 Task
或 Task<T>
对象。ConfigureAwait
是 Task
的一个扩展方法,允许你指定是否要捕获当前的同步上下文,并在继续执行异步操作时使用它。
使用场景
通常,当你在 UI
应用程序中使用异步方法时,你可能希望在 UI
线程上继续执行,以更新 UI
元素。默认情况下,await
会尝试捕获当前的同步上下文,并在异步操作完成后返回到这个上下文。但是,如果你在一个没有 UI
线程的上下文中使用 await
,或者你希望避免不必要的上下文捕获,你可以使用 ConfigureAwait(false)
。
语法
await someTask.ConfigureAwait(false);
参数
false
:指示 await
操作不需要捕获当前的同步上下文。这意味着当异步操作完成时,它不会尝试返回到原始的上下文,这可以提高性能,尤其是在没有 UI
线程或不需要 UI
更新的情况下。
true
(默认值):指示 await
操作应该捕获当前的同步上下文,并在异步操作完成后返回到这个上下文。这在需要更新 UI
或访问线程绑定对象时非常有用。
示例
public async Task SomeAsyncMethod()
{// 执行一些异步操作await SomeOtherAsyncMethod().ConfigureAwait(false);// 继续执行其他操作,这里不会捕获原始的同步上下文
}
总结
使用 ConfigureAwait(false)
可以提高性能,特别是在高并发的环境下,因为它避免了不必要的上下文切换。然而,你应该谨慎使用它,确保不会因此而违反线程安全或 UI
更新的需求。
CancellationTokenSource
CancellationTokenSource
是C#
中的一个类,它提供了一种机制来发出取消请求。这个类与 CancellationToken
类一起使用,允许异步操作被取消。以下是 CancellationTokenSource
的一些关键特性和用法:
-
创建: 你可以创建一个
CancellationTokenSource
的实例来开始一个取消操作。 -
取消: 通过调用
CancellationTokenSource
的Cancel
方法,你可以发出取消请求。 -
传播取消:
CancellationTokenSource
可以传播取消请求到所有与之关联的CancellationToken
对象。 -
超时: 你可以设置一个超时时间,如果超时时间到了,取消请求会自动发出。
-
链接: 你可以将多个
CancellationTokenSource
实例链接在一起,这样任何一个源发出取消请求,都会传播到所有链接的源。
下面是一个使用 CancellationTokenSource
的示例:
using System;
using System.Threading;
using System.Threading.Tasks;public class Program {public static void Main() {// 创建CancellationTokenSourcevar cts = new CancellationTokenSource();// 创建CancellationTokenCancellationToken token = cts.Token;// 启动一个异步任务Task task = Task.Run(() =>DoLongRunningOperation(token), token);// 模拟用户决定取消操作Console.WriteLine("按任意键取消操作...");Console.ReadKey();// 发出取消请求cts.Cancel();try {// 等待任务完成或抛出异常task.Wait();} catch (AggregateException ae) {// 处理取消异常foreach (var e in ae.InnerExceptions) {if (e is OperationCanceledException) {Console.WriteLine("操作已被取消。");}}}}private static void DoLongRunningOperation(CancellationToken cancellationToken) {for (int i = 0; i < 10; i++) {// 检查是否有取消请求cancellationToken.ThrowIfCancellationRequested();// 模拟长时间的工作Thread.Sleep(1000);Console.WriteLine($"执行步骤 {i + 1}");}}
}
总结
在这个示例中,我们创建了一个 CancellationTokenSource
并从它获取了一个 CancellationToken
。然后,我们启动了一个异步任务 DoLongRunningOperation
,并将 CancellationToken
传递给它。当用户按下任意键时,我们调用 Cancel
方法来发出取消请求。如果任务被取消,DoLongRunningOperation
方法中的 ThrowIfCancellationRequested
将抛出 OperationCanceledException
异常,我们捕获这个异常并处理它。
个人理解
对于一个aysnc
修饰的方法,没有什么特殊的,调用也是正常的按顺序执行,但是,一旦你使用了await
就会出现这样的事情:
- 首先,由于必须在有
aysnc
修饰的方法中使用await
, - 于是就说明的
async
的作用——将方法包装成状态机, - 所以在执行到
await
时:对于主线程来说,整个状态机(async
修饰的方法)都会被挂起,然后这个方法会到其他线程执行,主线程继续执行该方法之后的语句,直到await
后面的语句执行完毕, - 最后方法从被挂起的状态回归
例子如下
using System;
using System.Threading;
using System.Threading.Tasks;public class Program {public async static Task Main() {var cts = new CancellationTokenSource();CancellationToken token = cts.Token;try {DoLongRunningOperation(token);Console.WriteLine("Main Thread:" + Environment.CurrentManagedThreadId);Thread.Sleep(500);cts.Cancel();} catch (TaskCanceledException ee) {Console.WriteLine(ee.Message);}Console.ReadKey();}private async static Task DoLongRunningOperation(CancellationToken cancellationToken) {int i = 1;while (!cancellationToken.IsCancellationRequested) {Console.WriteLine("DoLo Thread:" + Environment.CurrentManagedThreadId);await Task.Delay(100);Console.WriteLine($"{i++}");}}
}
运行结果如下
DoLo Thread:1
Main Thread:1
1
DoLo Thread:4
2
DoLo Thread:4
3
DoLo Thread:4
4
DoLo Thread:4
5
相关文章:
C# Task 包含 await ConfigureAwait CancellationTokenSource
Task以下是 Task 类的一些关键特性和用法:以下是一些使用 Task 的示例:创建并启动一个任务使用 await 等待任务完成处理任务异常使用 Task<TResult> 获取结果取消任务总结 await暂停方法执行:非阻塞调用:任务结果获取&#…...
Python数据分析与建模库-02科学计算库Numpy01-05合集
1、该视频主要讲述了南派(NumPy)的核心操作和数据结构,以及如何使用NumPy库读取和处理数据。 2、该视频主要讲述了在编程中,如何对数组或矩阵中的元素进行判断和操作,以及在单排中如何进行类型转换。 3、该视频主要讲…...
【前端项目笔记】1 登录与登出功能实现
项目笔记 ☆☆代表面试常见题 前后端分离:后端负责写接口,前端负责调接口。 登录/退出功能 登录业务流程 登录页面:用户名密码 调用后台接口进行验证 通过验证,根据后台响应状态跳到项目主页 登录业务相关技术点࿱…...
是字符串定义以及在C语言中字符串是如何表示的
字符串(String)是由零个或多个字符(包括空格)组成的有限序列,常用于文本数据的存储和处理。在编程中,字符串是常见的数据类型。 在C语言中,字符串不是一种内置的数据类型,但C语言提…...
辽宁普通测径仪升级智能测径仪后都有哪些改进?
关键字: 普通测径仪, 智能测径仪, 测径仪升级, 测径仪特点, 智能测径仪优势, 目前多数厂家测径仪的数据处理方式是单片机计算出最终结果,然后传输到工控机后期处理。这样的电路系统对轧钢现场的高温、高粉尘和强电磁干扰的环境适应性很差,使得同一厂家、…...
【微信小程序】事件分类以及阻止事件冒泡
在微信小程序中,事件分为冒泡事件和非冒泡事件两大类,它们的区别在于事件是否能从原始触发组件开始,向父级组件传播(即“冒泡”)。 冒泡事件:当一个组件上的事件被触发后,不仅当前组件会接收到这…...
踩坑!被node-sass折磨的一天
文章目录 被node-sass折磨的一天折磨过程了解原因注意事项 被node-sass折磨的一天 折磨过程 起因是要开发一个老项目,照常拉代码、下依赖、启动三步走 依赖开始下载不对了,以为是node版本问题,寻找node-sass对应的node版本 利用nvm&#…...
App UI 风格打造独特体验
App UI 风格打造独特体验...
【学习笔记8】阅读StyleID论文源码
论文【链接】 源码【链接】 一、DDIM eta ddim_step表示执行几轮去噪迭代,eta表示DDPM和DDIM的插值系数。当eta0时,为DDPM;当eta≠0时,为DDIM。 参考 DDIM 简明讲解与 PyTorch 实现:加速扩散模型采样的通用方法 【s…...
wordpress旅游网站模板
旅行社wordpress主题 简洁实用的旅行社wordpress主题,适用于旅行社建网站的wordpress主题模板。 https://www.jianzhanpress.com/?p4296 旅游WordPress主题 简洁实用的旅游WordPress主题,适合做旅游公司网站的WordPress主题模板。 https://www.jian…...
vs2019 c++20规范 STL 库中头文件 <atomic> 源码注释及探讨几个知识点
(1 探讨一) 模板类 atomic 的继承关系与数据结构如下: (2 探讨二 ) 可见 atomic 的 fetch_xx 函数,返回的都是 atomic 中存储的旧值。测试如下: 谢谢...
Flink任务如何跑起来之 2.算子 StreamOperator
Flink任务如何跑起来之 2.算子 StreamOperator 前文介绍了Transformation创建过程,大多数情况下通过UDF完成DataStream转换中,生成的Transformation实例中,核心逻辑是封装了SimpleOperatorFactory实例。 UDF场景下,DataStream到…...
学习笔记——路由网络基础——路由优先级(preference)
1、路由优先级(preference) 路由优先级(preference)代表路由的优先程度。当路由器从多种不同的途径获知到达同一个目的网段的路由(这些路由的目的网络地址及网络掩码均相同)时,路由器会比较这些路由的优先级,优选优先级值最小的路由。 路由来源的优先…...
数据预处理——调整方差、标准化、归一化(Matlab、python)
对数据的预处理: (a)、调整数据的方差; (b)、标准化:将数据标准化为具有零均值和单位方差;(均值方差归一化(Standardization)) (c)、最值归一化,也称为离差标准化,是对原始数据的…...
opencv_特征检测和描述
理解特征 寻找独特的特定模式或特定特征,可以轻松跟踪和比较。 拼图:在图像中搜索这些特征,找到它们,在其他图像中查找相同的特征并对齐它们。而已。 基本上,角被认为是图像中的好特征。 在本单元中,我…...
CID引流电商下的3C产品选品策略深度解析
摘要:随着电商行业的迅猛发展和消费者需求的日益多样化,CID引流电商作为一种新兴的电商模式,逐渐受到了广泛关注。在这一模式下,3C产品作为高客单价、高技术含量的代表品类,其选品策略的制定显得尤为重要。本文将从多…...
DeepSORT(目标跟踪算法)中的状态向量与状态转移矩阵
DeepSORT(目标跟踪算法)中的状态向量与状态转移矩阵 flyfish 状态转移矩阵(State Transition Matrix)F的构造 这篇是一定要看的,拖到文章的最后部分,需要理解状态转移矩阵怎么来的,怎么是这个…...
李宏毅深度学习01——基本概念简介
视频链接 基本概念 Regression(回归): 类似于填空 Classification(分类): 类似于选择 Structure Learning(机器学习): ?? 机器学习找对应函数…...
TcpClient 服务器、客户端连接
TcpClient 服务器 TcpListener 搭建tcp服务器的类,基于socket套接字通信的 1 创建服务器对象 TcpListener server new TcpListener(IPAddress.Parse("127.0.0.1"), 3000); 2 开启服务器 设置最大连接数 server.Start(1000); 3 接收客户端的链接,只能…...
13大最佳工程项目管理系统软件盘点
国内外主流的13款工程项目管理系统软件:Worktile、中建软件、泛微建筑项目管理软件、LiquidPlanner、Wrike、建文软件、广联达、Microsoft Project、泛普软件、Procore、Buildertrend、Fieldwire、Autodesk Construction Cloud。 在快速变化的工程领域,有…...
SpringMVC:拦截器(Interceptor)
1. 简介 拦截器(Interceptor)类似于过滤器(Filter) Spring MVC的拦截器作用是在请求到达控制器之前或之后进行拦截,可以对请求和响应进行一些特定的处理。拦截器可以用于很多场景下: 1. 登录验证…...
【Python】selenium使用find_element时解决【NoSuchWindowException】问题的方法
NoSuchWindowException 是 Selenium WebDriver 中的一种异常,当尝试切换到一个不存在的窗口时,或者在尝试获取窗口句柄时窗口已经关闭或不存在,就会抛出这个异常。 以下是一些解决 NoSuchWindowException 的常见方法: 检查窗口是…...
PTA:7-188 水仙花数
作者 王秀秀 单位 山东交通学院 任务描述 本关任务:输出100到999之间的所有的“水仙花数”。所谓的“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。 例如,153是一个水仙花数,因为 15313 53 33 提示 关键在于对一…...
HTML静态网页成品作业(HTML+CSS+JS)—— 美食企业曹氏鸭脖介绍网页(4个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,使用Javacsript代码实现 图片轮播切换,共有4个页面。 二、…...
SCI二区|鲸鱼优化算法(WOA)原理及实现【附完整Matlab代码】
目录 1.背景2.算法原理2.1算法思想 3.结果展示4.参考文献5.代码获取 1.背景 2016年,S Mirjalili受到自然界座头鲸社会行为启发,提出了鲸鱼优化算法(Whale Optimization Algorithm, WOA)。 2.算法原理 WOA模拟了座头鲸的社会行为…...
人脸匹配——OpenCV
人脸匹配 导入所需的库加载dlib的人脸识别模型和面部检测器读取图片并转换为灰度图比较两张人脸选择图片并显示结果比较图片创建GUI界面运行GUI主循环运行显示全部代码 导入所需的库 cv2:OpenCV库,用于图像处理。 dlib:一个机器学习库&#x…...
韩顺平0基础学java——第22天
p441-459 异常exception 选中代码块,快捷键ctraltt6,即trt-catch 如果进行了异常处理,那么即使出现了异常,但是会继续执行 程序过程中发生的异常事件分为两大类: 异常体系图※ 常见的运行异常:类型转换…...
神经网络介绍及教程案例
神经网络介绍及教程&案例 神经网络(Neural Networks)是机器学习和人工智能中的一种关键技术,模仿了人类大脑的工作方式,能够处理复杂的数据和任务。以下是神经网络的一些基础介绍: 基本概念 神经元(N…...
16个不为人知的资源网站,强烈建议收藏!
整理了16个不为人知的资源网站,涵盖了课程学习、办公技能、娱乐休闲、小说音乐等多种资源,强烈建议收藏! #学习网站 1、中国大学MOOC icourse163.org/ 这是一个汇集了国内顶尖大学免费课程资源的平台,众多985工程院校如北京大…...
pandas获取某列最大值的所有数据
第一种方法: 按照某列进行由大到小的排序,然后再进去去重,保留第一个值,最终保留的结果就是最大值的数据 # 由大到小排序 data_frame data_frame.sort_values(bycolumn_a, ascendingFalse)# 按照column_b列去重保留第一条&#…...
网站制作素材图片/网站推广优化平台
浅谈计算机硬件维护毕业论文 (20页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!14.9 积分毕业论文课题浅谈计算机硬件维护系别计算机科学系专业计算机网络技术班级网络一班姓名学号11111111指导教师…...
wordpress中文插件下载/网站建设服务
ip 是个指令喔!并不是那个 TCP/IP 的 IP 啦!这个 ip 指令的功能可多了!基本上,他就是整合了 ifconfig 与 route 这两个指令啰~不过, ip 可以达成的功能却又多更多!真是个相当厉害的指令。如果你…...
建筑设计方案网站/职业培训网络平台
对开发者和记者来说,同时有几部手机需要测试的时候,只得尽力对付。然而,微软会限制你用一个Live账号绑定WP手机的数量,绑定手机的时间间隔也有要求。对此,我们想一窥究竟。 Lumia 900即将到来,现在我得数数…...
小说网站排名/北京网站优化托管
https://blog.csdn.net/l741299292/article/details/69671789转载于:https://www.cnblogs.com/DLarTisan/p/8858534.html...
目前最流行网站开发软件/百度一下百度网页官
反集的反集不是朋友。。。要是把他们合并便多了 //并查集反集的思想 #include<cstdio> #include<iostream> using namespace std; int n,m; int flag; int flag1[9999]; int f[2500]; int find(int x) {if(f[x]!x) f[x]find(f[x]); return f[x];}//找祖先路径压…...
wordpress破解插件/安徽seo优化
这个问题真的好纠结,数据保存到数据库后读出来的时候显示在页面上的却是一大段含有html标签的文字。整了好久代码明明就没错误显示出来怎么就成这样子呢,自己气的差点要吐血。后来才知道原来是struts标签的问题。普通的html标签是不会有这个问题的。 解决…...