在C#中,异步编程是处理耗时操作,如I/O请求、数据库调用或网络请求等,而不阻塞主线程的一种有效方法。Task 类是这种异步操作的核心,它允许我们启动异步操作并等待其完成。然而,有时我们可能需要在任务完成之前取消它,特别是当任务依赖于某些外部条件或用户交互时。在C#中,取消任务通常通过使用 CancellationToken 来实现。
CancellationToken 是一个结构,用于传递取消操作的通知,如用户请求取消或超时。CancellationTokenSource 是用于生成 CancellationToken 的类,并提供了取消该令牌的方法。
下面是一个简单的示例,展示了如何使用 CancellationToken 和 CancellationTokenSource 来取消一个任务:
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 方法来提供取消信号。在任务代码中,我们定期检查取消标记,如果已请求取消,则退出循环。
本文链接:http://www.28at.com/showinfo-26-82183-0.htmlC# 中取消任务(Task)的正确方式
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 四万字102道Java多线程经典面试题
下一篇: 我们一起聊聊架构复杂度来源高可用