You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中终止正在运行的Task任务?

C#中终止异常Task并返回执行计数的实现方法

针对你给出的代码场景,有几种实用的方式可以在遇到异常情况时终止Task并返回已完成的计数:

方法一:直接提前返回

在判断到异常情况时,直接从Task.Run的委托中return,任务会立即终止,同时保留当前的count值:

public static async Task<int> Method1()
{
    int count = 0;
    await Task.Run(() =>
    {
        for (int i = 0; i < 100; i++)
        {
            // 执行业务逻辑
            if (/* 异常条件判断 */)
            {
                // 直接return终止任务
                return;
            }
            count += 1;
        }
    });
    return count;
}

这种方式简单直接,适合不需要对外抛出异常、仅需要终止任务并返回已完成计数的场景。

方法二:抛出异常终止任务

如果需要将异常情况通知到调用方,可以在异常条件触发时抛出异常,此时任务会终止,调用方可以通过try/catch捕获异常,同时也能获取到异常发生前的count值:

public static async Task<int> Method1()
{
    int count = 0;
    try
    {
        await Task.Run(() =>
        {
            for (int i = 0; i < 100; i++)
            {
                // 执行业务逻辑
                if (/* 异常条件判断 */)
                {
                    throw new InvalidOperationException("出现异常情况,终止任务");
                }
                count += 1;
            }
        });
    }
    catch (InvalidOperationException ex)
    {
        // 处理异常,比如记录日志
        Console.WriteLine(ex.Message);
    }
    return count;
}

抛出的异常会被await捕获,不会导致程序崩溃,同时count会保留到异常发生前的数值。

方法三:使用CancellationToken(推荐的异步取消方式)

如果任务需要支持外部取消或者更规范的异步取消流程,可以使用CancellationToken,内部触发取消信号来终止任务:

public static async Task<int> Method1()
{
    int count = 0;
    var cts = new CancellationTokenSource();
    try
    {
        await Task.Run(() =>
        {
            for (int i = 0; i < 100; i++)
            {
                // 检查是否已取消,若已取消则抛出OperationCanceledException
                cts.Token.ThrowIfCancellationRequested();
                
                // 执行业务逻辑
                if (/* 异常条件判断 */)
                {
                    // 触发取消信号
                    cts.Cancel();
                }
                count += 1;
            }
        }, cts.Token);
    }
    catch (OperationCanceledException)
    {
        // 处理取消逻辑,比如记录任务被终止
        Console.WriteLine("任务因异常情况被终止");
    }
    finally
    {
        cts.Dispose();
    }
    return count;
}

这种方式符合.NET异步编程的取消规范,不仅可以内部触发取消,也支持外部通过cts.Cancel()来终止任务,同时能清晰地区分“正常完成”和“取消终止”的状态。


内容的提问来源于stack exchange,提问作者KingVoodoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:33:28