学习
实践
活动
专区
工具
TVP
写文章

C#中使用 CancellationToken 处理异步任务

.NET Core 中使用异步编程已经很普遍了, 你项目中随处可见 async 和 await,它简化了异步操作,允许开发人员,使用同步方式编写异步代码,你会发现在大部分异步方法,都提供了CancellationToken 参数,本文主要介绍下 CancellationTokenSource 和 CancellationToken异步任务使用。 手动取消任务 创建一个 CancellationTokenSource,然后调用异步方法,传入 CancellationToken,它是一个轻量级对象,可以通知请求是否已取消,我们可以手动调用 cts.Cancel cts.CancelAfter(1000); CancellationToken 注册回调 我们可以调用 Register()方法,注册Token取消回调,参数需要传入 Action 委托。 Unregister(); HttpClient 中使用 同样,你可以 HttpClient 中使用传入 CancellationToken (或者使用HttpClientTimeout属性),

87110

Python3 与 C# 并发编程之~ 上篇

(线程池产生一种并发类型,eg:异步编程) 响应式编程:一种编程模式,对事件进行响应(有点类似于JQ事件) Net里面很少用进程,以前基本上都是 线程+池+异步+并行+协程 我这边简单引入一下,毕竟主要是写 ,你设置成Task就行了,触发是类似于事件之类方法才使用void,不然没有返回值都是使用Task 项目里经常有这么一个场景:等待一组任务完成后再执行某个操作,看个引入案例: ///

       return await task;    } } 一个async方法被await调用后,当它恢复运行时就会回到原来上下文中运行。 逆天建议是:核心代码里面一种使用 ConfigureAwait,用户页面相关代码,不需要上下文加上 其实如果有太多await在上下文里恢复那也是比较卡使用 ConfigureAwait之后,被暂停后会在线程池里面继续运行 .WithCancellation(CancellationToken) Token用法和上面一样,就不复述了,如果需要和异步结合,一个 Task.Run就可以把并行任务交给线程池了 也可以使用Task

36140
  • 广告
    关闭

    【玩转 GPU】有奖征文

    精美礼品等你拿!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    NetCore并发编程

    并行处理:多线程一种(线程池产生一种并发类型,eg:异步编程) 响应式编程:一种编程模式,对事件进行响应(有点类似于JQ事件) Net里面很少用进程,以前基本上都是 线程+池+异步+并行+协程 Task就行了,触发是类似于事件之类方法才使用void,不然没有返回值都是使用Task 项目里经常有这么一个场景:等待一组任务完成后再执行某个操作,看个引入案例: ///

    /// 1 return await task; }} 一个async方法被await调用后,当它恢复运行时就会回到原来上下文中运行。 逆天建议是:核心代码里面一种使用 ConfigureAwait,用户页面相关代码,不需要上下文加上 其实如果有太多await在上下文里恢复那也是比较卡使用 ConfigureAwait之后,被暂停后会在线程池里面继续运行 .WithCancellation(CancellationToken) Token用法和上面一样,就不复述了,如果需要和异步结合,一个 Task.Run就可以把并行任务交给线程池了 也可以使用Task

    2.1K40

    WPF程序shutdown期间引发TaskCanceledException

    ,陆续有公司发现自己WPF软件收到大量用户报告TaskCanceledException 异常, 就是上面堆栈信息,有的公司一个月内达到了惊人150k异常数据。 翻译过来就是 对于某些特定.NET应用程序(注:目前仅影响WPF),AppDomain或者进程关闭,Finalizer线程计时问题可能会引发异常。 根因 时机问题来源:WeakEventTableOnShutDown()方法,指定了300ms超时(注:部分开发评论这个时间是arbitrary 武断) 代码如下: private void OnShutDown succeeded) { Purge(true); } } } 可以看到,错误线程调用该方法,进入else,然后触发超时。 OnShutDown()方法 2、减少关闭期间Dispatcher调用 参考链接: c# - TaskCanceledException in ShutDownListener - Stack Overflow

    49120

    .net 温故知新:【5】异步编程 async await

    EAP 是 .NET Framework 2.0 引入,比较多体现在WinForm编程,WinForm编程很多控件处理事件都是基于事件模型,经常用到跨线程更新界面的时候就会使用到BeginInvoke 事件模式算是对APM一种补充,定义了一系列事件包括完成、进度、取消事件让我们异步调用时候能注册响应事件进行操作。 以上两种方式已不推荐使用,编写理解起来比较晦涩,感兴趣可以自行了解下,而且这种方式.net 5里面已经不支持委托异步调用了,所以如果要运行需要在.net framework框架下。 该类也有一个if判断,按照 1__state 状态参数,最开始调用时候是-1,执行进来 num ! 2、Sleep await 之后,但是 await 执行在调用线程上也会阻塞调用方线程。 所以我们应该使用 Task.Delay 用于等待操作。

    36420

    c#异步编程-Task(二)

    异步调用执行 整个执行与之前同步例子调用图执行顺序一样,因为我们对每个异步函数调用都进行了await。 调用图中创建了一个没有并行和重叠连续流。 (i); await Task.Delay(1000,cancellationToken); } } 这时,task遇到请求时会立即停止(而不是1秒钟之后才停止) 这里,我们无需调用 取消标记在调用很好向下传播(就像是因为异常,取消请求调用向上级联一样)。 同步方法 同步方法也支持取消(例如TaskWait方法)。 异步场景,故障Task和取消Task之间区别并不重要,因为它们await都会抛出一个OperationcanceledException。 因为这可能是一个库方法,无需与外界共享状态,所以await我们使用了ConfigureAwait(false)来避免弹回到UI同步上下文。

    59530

    C#异步使用要点(翻译)

    异步操作需要注意要点 1.使用异步方法返回值应当避免使用void 使用异步方法中最好不要使用void当做返回值,无返回值也应使用Task作为返回值,因为使用void作为返回值具有以下缺点 无法得知异步函数状态机什么时候执行完毕 )传递给所有使用API 由于.NET取消操作必须显示传递CancellationToken,所以如果想取消所有调用异步函数,那么应该将CancllationToken传递给此调用所有函数 下面例子调用ReadAsync并没有传递CancellationToken,所以不能有效取消 public async Task<string> DoAsyncThing(CancellationToken 进行判断是完成还是被取消了 使用CancellationToken 下面例子使用Task.delay(-1,token)创建在触发CancellationToken触发任务,但是如果CancellationToken StreamWriter(s)或Stream(s)Dispose之前建议先调用FlushAsync 当使用Stream和StreamWriter进行异步写入时,底层数据也有可能被缓冲,当数据被缓冲

    1.5K50

    ASP.NET Core处理中止请求

    当用户向应用程序发出请求,服务器将解析该请求,生成响应,然后将结果发送给客户端。用户可能会在服务器处理请求时候中止请求。就比如说用户跳转到另一个页面获取说关闭页面。 在这种情况下,我们希望停止所有正在进行工作,以浪费不必要资源。例如我们可能要取消SQL请求、http调用请求、CPU密集型操作等。 ASP.NET Core提供了HTTPContext.RequestAborted检测客户端何时断开连接属性,我们可以通过IsCancellationRequested以了解客户端是否中止连接。 ) { await Task.Delay(1000, cancellationToken); return Array.Empty<WeatherForecast Task.Delay(1000, cancellationToken); return Array.Empty<WeatherForecast>(); } }

    50210

    2019-1-27-Task真的取消了么(2)

    之前博客2019-1-24-Task真的取消了么 - huangtengxiao介绍了task.run需要在方法执行过程主动调用ThrowIfCancellationRequested()才能取消 ,这次我们研究下其他情况取消场景 ---- Task .Delay 我们知道Task.Dealy也有一个重载可以传入CancellationToken,我们做如下实验 static void Console.WriteLine($"{i}任务结束"); }); }); } 通过Parallel.For创建10个并行任务,每个任务需要5秒钟,而第3秒取消任务 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。 欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://xinyuehtx.github.io ),不得用于商业目的,基于本文修改后作品务必以相同许可发布。

    30930

    2019-1-24-Task真的取消了么

    可是有多少人真的去了解过当调用CancellationSource.Cancel方法,Task是否真的被取消了 ---- 我们做个实验 public static async void 任务有被正常取消了 原因 实际上,当Task.Run任务真正开始执行后,调用CancellationSource.Cancel方法并不能取消任务,或者结束调用线程。调用方法仍然会顺利执行。 那么带有CancellationToken方法重载有什么用呢? 1、如第三个例子所示,在任务运行开始之前,调用Cancel可以直接取消任务,避免额外消耗一个线程 2、当对应token,执行体抛出OperationCanceledException,(即调用CancellationToken.ThrowIfCancellationRequested 所以我们为Task.Run添加了CancellationToken后仍需要,方法执行时手动判断token是否取消 参考链接: c# - How to cancel a running task?

    31320

    使用异步操作注意要点(翻译)

    异步操作需要注意要点 1.使用异步方法返回值应当避免使用void 使用异步方法中最好不要使用void当做返回值,无返回值也应使用Task作为返回值,因为使用void作为返回值具有以下缺点 无法得知异步函数状态机什么时候执行完毕 )传递给所有使用API 由于.NET取消操作必须显示传递CancellationToken,所以如果想取消所有调用异步函数,那么应该将CancllationToken传递给此调用所有函数 ❌下面例子调用ReadAsync并没有传递CancellationToken,所以不能有效取消 public async Task<string> DoAsyncThing(CancellationToken 使用异步IO,应该将options参数设置为FileOptions.Asynchronous,否则会产生额外线程浪费,详细信息请参考CLR28.12节 9.建议取消那些不会自动取消操作(CancellationTokenRegistry StreamWriter(s)或Stream(s)Dispose之前建议先调用FlushAsync 当使用Stream和StreamWriter进行异步写入时,底层数据也有可能被缓冲,当数据被缓冲

    1.7K20

    .NET - Task.Run vs Task.Factory.StartNew

    .NET 4 ,Task.Factory.StartNew 是安排新任务首选方法。它有许多重载提供了高度可配置机制,通过启用设置选项,可以传递任意状态、启用取消,甚至控制调度行为。 因此, .NET Framework 4.5 开发者预览版 ,我们引入了新 Task.Run 方法。 return 42; }); 这里通过使用 async 关键词,编译器会将这个委托(delegate)映射成 Func<Task<int>>,调用该委托会返回 Task<int> 表示此调用最终完成 await Task.Delay(1000); return 42; }).Unwrap(); 现在,这里 “t” 变量类型将会是 Task<int>,表示异步调用返回值。 ); return 42; }); 变量 result 类型将会是 int,正如您期望那样,调用此任务大约一秒种后,变量 result 值将被设置为 42。

    17130

    C#线程安全使用(四)

    这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒发到外面,现在一点点把东软写文章给转移出来。 这里主要讲解下CancellationTokenSource,CancellationTokenSource是用于取消线程,具体使用起来有点另类:首先定义实体,然后将其下属性ToKen传递给线程,当需要取消线程调用下Cancel()方法。 MSDN解释是: ContinueWhenAll 方法执行 continuationAction 委托, tasks 数组所有任务完成后,无论它们完成状态。 ,所以我也是运行了好几次,看这个结果会发现一件事,线程只执行了两个,即当线程2调用Cancel后,其他线程也被取消了。

    37130

    【半译】扩展shutdown超时设置以保证IHostedService正常关闭

    我最近发现一个问题,当应用程序关闭,我们应用程序没有正确执行在IHostedServiceStopAsync方法。经过反复验证发现,这是由于某些服务对关闭信号做出响应所需时间太长导致。 ; Task StopAsync(CancellationToken cancellationToken); } StartAsync应用程序启动调用。 StopAsync当应用程序收到shutdown(SIGTERM)信号(例如,您CTRL+C控制台窗口中按入,或者应用程序被主机系统停止),将调用。 问题一部分是Kafka库(和基础librdkafka库)使用同步阻塞Consume调用而不是异步可取消调用方式。解决这个问题方法不是很好。 理解此问题简便方法是一个示例。 摘要 在这篇文章,我讨论了一个最近发现问题,该问题是当应用程序关闭,我们应用程序未在IHostedService实现StopAsync运行该方法。

    67431

    Asp.Net Core 轻松学-多线程之取消令牌

    前言     取消令牌(CancellationToken) 是 .Net Core 一项重要功能,正确并合理使用 CancellationToken 可以让业务达到简化代码、提升服务性能效果; 当在业务开发,需要对一些特定应用场景进行深度干预时候,CancellationToken 将发挥非常重要作用。 通过上面的输出接口,可以看出,红色部分是模拟请求,这个请求多线程进行,Post 和 Love 交替出现,是因为程序通过线程休眠方式模拟网络阻塞过程,蓝色为合并结果部分,可以看到,虽然“文章信息 对长时间阻塞调用异步取消令牌应用 某些场景,我们需要请求外部第三方资源,比如请求天气预报信息;但是,由于网络等原因,可能会造成长时间等待以致业务超时退出,这种情况可以使用 CancellationToken CancellationToken 链式反应 可以使用创建一组令牌,通过链接各个令牌,使其建立通知关联,当 CancellationToken某个令牌收到取消通知时候,由链式创建出来 CancellationToken

    61230

    Asp.net core使用MediatR进程内发布订阅

    介绍下业务场景吧,一个公共操作A,业务各个地方都会做A操作,正常人正常思维应该是把A操作提取出来封装,其他地方调用,可这哥们儿偏偏不这么干,代码到处复制。 仔细分析了整个业务之后,发现是一个典型事件/消息驱动型,或者叫发布/订阅型业务逻辑。鉴于系统是单体,所以想到利用进程内发布/订阅解决方案。 可以看到,服务1method方法,发布了SomeEvent事件消息。 服务2代码: ? 解释下,为啥服务2 Method方法,要等待5秒,因为实际项目中,有这么一个操作,把一个压缩程序包传递到远端,然后远端代码操作IIS创建站点,这玩意儿非常耗时,大概要1分多钟,这里我用5s模拟,意思意思 至此,Demo要干的事情,脉络应该很清晰了:控制器接收HTTP请求,然后调用Service1Method,service1Method又发布消息,消息处理器接收到消息,调用Service2Method

    53910

    ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务

    (ASP.NET Core 系列目录) 一、应用场景   以调用微信公众号Api为例, 经常会用到access_token,官方文档这样描述:“是公众号全局唯一接口调用凭据,有效期目前为2个小时,需定时刷新 ,重复获取将导致上次获取access_token失效,建议公众号开发者使用控服务器统一获取和刷新Access_token,其他业务逻辑服务器所使用access_token均来自于该控服务器,不应该各自去刷新 在这个场景我们可以创建一个后台运行服务,按照access_token有效期定时执行去请求获取新access_token并存储,其他所有需要用到这个access_token都到这个共有的access_token 二、实现方式(一)   ASP.NET Core 2.0时候就提供了一个名为IHostedService接口,我们要做只有两件事:     1. 实现它。 2. 三、实现方式(二)   ASP.NET Core 2.1, 提供了一个名为 BackgroundService  类,它在 Microsoft.Extensions.Hosting 命名空间中,查看一下它源码

    81640

    关注

    腾讯云开发者公众号
    10元无门槛代金券
    洞察腾讯核心技术
    剖析业界实践案例
    腾讯云开发者公众号二维码

    相关产品

    • 腾讯会议

      腾讯会议

      腾讯会议(TM)是一款基于腾讯21年音视频通讯经验积累的高清流畅、便捷易用、安全可靠的云视频会议产品,让您随时随地高效开会,全方位满足不同场景下的会议需求。

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭

      扫码关注腾讯云开发者

      领取腾讯云代金券