C#中任务取消的协作式原理是通过CancellationTokenSource发送取消信号,任务需主动检查CancellationToken或调用ThrowIfCancellationRequested响应,而非强制终止。

C#中,
CancellationTokenSource
要实现任务取消,我们通常会遵循一套流程。 首先,你需要创建一个
CancellationTokenSource
var cts = new CancellationTokenSource();
接着,从
CancellationTokenSource
CancellationToken
Token
CancellationToken token = cts.Token;
在你的任务或长时间运行的方法内部,你需要周期性地检查这个
Token
token.IsCancellationRequested
// 示例:一个长时间运行的任务
Task.Run(() =>
{
    while (true)
    {
        if (token.IsCancellationRequested)
        {
            Console.WriteLine("任务收到取消请求,准备退出...");
            // 在这里执行一些清理工作
            break; // 退出循环
        }
        Console.WriteLine("任务正在执行...");
        Thread.Sleep(500); // 模拟耗时操作
    }
}, token); // 也可以将token传递给Task.Run,这样如果token被取消,Task会进入Canceled状态更推荐的做法是使用
token.ThrowIfCancellationRequested()
Token
OperationCanceledException
Task.Run(() =>
{
    try
    {
        for (int i = 0; i < 100; i++)
        {
            token.ThrowIfCancellationRequested(); // 如果取消,这里会抛异常
            Console.WriteLine($"任务执行到第 {i} 步...");
            Thread.Sleep(200);
        }
    }
    catch (OperationCanceledException)
    {
        Console.WriteLine("任务因取消请求而终止。");
    }
}, token);当你想取消任务时,只需调用
CancellationTokenSource
Cancel()
cts.Cancel();
最后,别忘了
CancellationTokenSource
IDisposable
Dispose()
using
using (var cts = new CancellationTokenSource()) { /* ... */ }我们谈到
CancellationTokenSource
Thread.Abort()
简单来说,
CancellationTokenSource
CancellationToken
Token
IsCancellationRequested
ThrowIfCancellationRequested()
通过协作,任务可以在收到取消请求时,有机会完成当前的原子操作、释放已持有的资源、回滚未提交的事务,或者至少记录下当前状态,然后才优雅地退出。这给了开发者极大的控制权,确保了程序的健壮性和稳定性。当然,这也意味着如果你的任务代码里没有检查
CancellationToken
Cancel()
当
CancellationToken
ThrowIfCancellationRequested()
CancellationToken
Task.Run
HttpClient.GetAsync
OperationCanceledException
OperationCanceledException
async/await
try-catch
看一个例子:
public async Task DoSomethingCancellableAsync(CancellationToken token)
{
    try
    {
        Console.WriteLine("异步任务开始...");
        for (int i = 0; i < 10; i++)
        {
            token.ThrowIfCancellationRequested(); // 检查取消
            await Task.Delay(500, token); // 这里的Task.Delay也支持取消
            Console.WriteLine($"异步任务进行到 {i + 1} 步。");
        }
        Console.WriteLine("异步任务完成。");
    }
    catch (OperationCanceledException ex)
    {
        // 这是一个预期的取消,不是错误
        Console.WriteLine($"异步任务被取消了: {ex.Message}");
        // 在这里可以进行一些清理工作,比如关闭文件、释放网络连接等
        // 如果需要,可以重新抛出,但通常不需要
        // throw; 
    }
    catch (Exception ex)
    {
        // 处理其他非取消引起的错误
        Console.WriteLine($"异步任务发生未知错误: {ex.Message}");
    }
    finally以上就是C#的CancellationTokenSource如何取消任务?的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号