当前位置:首页 > 科技  > 软件

C# 中取消任务(Task)的正确方式

来源: 责编: 时间:2024-04-09 09:08:17 271观看
导读在C#中,异步编程是处理耗时操作,如I/O请求、数据库调用或网络请求等,而不阻塞主线程的一种有效方法。Task 类是这种异步操作的核心,它允许我们启动异步操作并等待其完成。然而,有时我们可能需要在任务完成之前取消它,特别是

在C#中,异步编程是处理耗时操作,如I/O请求、数据库调用或网络请求等,而不阻塞主线程的一种有效方法。Task 类是这种异步操作的核心,它允许我们启动异步操作并等待其完成。然而,有时我们可能需要在任务完成之前取消它,特别是当任务依赖于某些外部条件或用户交互时。在C#中,取消任务通常通过使用 CancellationToken 来实现。8yS28资讯网——每日最新资讯28at.com

CancellationToken 和 CancellationTokenSource

CancellationToken 是一个结构,用于传递取消操作的通知,如用户请求取消或超时。CancellationTokenSource 是用于生成 CancellationToken 的类,并提供了取消该令牌的方法。8yS28资讯网——每日最新资讯28at.com

下面是一个简单的示例,展示了如何使用 CancellationToken 和 CancellationTokenSource 来取消一个任务:8yS28资讯网——每日最新资讯28at.com

using System;using System.Threading;using System.Threading.Tasks;class Program{    static async Task Main(string[] args)    {        using CancellationTokenSource cts = new CancellationTokenSource();        CancellationToken cancellationToken = cts.Token;        // 启动一个可以被取消的任务        Task myTask = Task.Run(() => DoWork(cancellationToken), cancellationToken);        // 假设一段时间后,我们决定取消任务        await Task.Delay(2000); // 等待2秒        Console.WriteLine("Cancelling the task...");        cts.Cancel(); // 发送取消信号        try        {            await myTask; // 等待任务完成或捕获到OperationCanceledException异常        }        catch (OperationCanceledException)        {            Console.WriteLine("Task was cancelled");        }    }    static void DoWork(CancellationToken cancellationToken)    {        for (int i = 0; i < 10; i++)        {            if (cancellationToken.IsCancellationRequested)            {                Console.WriteLine("Cancellation requested.");                // 检查取消标记,如果已请求取消,则退出循环或执行其他清理操作                break; // 或者返回,抛出OperationCanceledException等。            }            // 模拟工作正在进行中...            Thread.Sleep(500); // 不要在生产代码中使用Thread.Sleep! 这里只是为了示例。            Console.WriteLine("Working...");        }    }}

在这个示例中,我们创建了一个 CancellationTokenSource 实例,并使用其 Token 属性生成了一个 CancellationToken。然后,我们将这个令牌传递给了一个在后台运行的任务(通过 Task.Run)。稍后,我们决定取消这个任务,于是调用了 CancellationTokenSource.Cancel 方法来提供取消信号。在任务代码中,我们定期检查取消标记,如果已请求取消,则退出循环。8yS28资讯网——每日最新资讯28at.com

注意事项和最佳实践:

  1. 定期检查取消标记:在你的任务代码中,你应该定期检查 CancellationToken.IsCancellationRequested 属性,以便在收到取消请求时能够迅速响应。
  2. 处理取消请求:当检测到取消请求时,你的代码应该尽快停止当前的操作并退出。你可以通过抛出 OperationCanceledException 异常、返回或执行其他适当的清理操作来实现这一点。
  3. 使用正确的等待方式:在等待可能被取消的任务时,最好使用 await 关键字而不是 Task.Wait() 或 Task.Result,因为后者在任务被取消时会抛出 AggregateException 而不是 OperationCanceledException,这可能会使异常处理更加复杂。
  4. 资源清理:确保在取消操作后妥善处理和清理所有已分配的资源,以避免内存泄漏或其他潜在问题。这包括关闭文件句柄、释放数据库连接等。
  5. 文档和测试:如果你的方法接受一个 CancellationToken 参数,确保在方法的文档中明确说明这一点,并编写针对取消操作的单元测试,以确保你的代码在收到取消信号时能够正确响应。

本文链接:http://www.28at.com/showinfo-26-82183-0.htmlC# 中取消任务(Task)的正确方式

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 四万字102道Java多线程经典面试题

下一篇: 我们一起聊聊架构复杂度来源高可用

标签:
  • 热门焦点
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 疑似小米14外观设计图曝光:后置相机模组变化不大

    下半年的大幕已经开启,而谁将成为下半年手机圈的主角就成为了大家关注的焦点,其中被传有望拿下新一代骁龙8 Gen3旗舰芯片的小米14系列更是备受大家瞩
  • 华为Mate60标准版细节曝光:经典星环相机模组回归

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,iQOO 11不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞屏,同时在快充
  • 苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top