C# ParallelOptions的MaxDegreeOfParallelism和CancellationToken怎么用

来源:Java编程网作者:北京GEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《C# ParallelOptions的MaxDegreeOfParallelism和CancellationToken怎么用》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C# ParallelOptions的MaxDegreeOfParallelism和CancellationToken怎么用》有用,将其分享出去将是对创作者最好的鼓励。

在C#并行编程中,ParallelOptions是配置并行操作行为的核心类,其中MaxDegreeOfParallelism和CancellationToken是两个非常实用的属性,分别用于控制并行并发数量和实现任务取消功能。合理运用这两个属性,能够提升并行代码的执行效率和可控性。

C# ParallelOptions的MaxDegreeOfParallelism和CancellationToken怎么用

MaxDegreeOfParallelism的作用与用法

MaxDegreeOfParallelism用于设置并行循环或操作的最大并发任务数,默认值为-1,表示由运行时根据系统资源自动决定并发数量。当我们需要限制并行操作的资源占用时,就可以手动设置这个属性的值。

比如我们有一个需要处理大量数据的并行循环,不希望同时启动太多线程导致CPU占用过高,就可以将MaxDegreeOfParallelism设置为合适的数量:

using System;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        // 创建ParallelOptions实例并设置最大并发数为4
        ParallelOptions options = new ParallelOptions
        {
            MaxDegreeOfParallelism = 4
        };

        // 并行处理1到10的数字
        Parallel.For(1, 11, options, (i) =>
        {
            Console.WriteLine($"正在处理数字 {i},线程ID:{System.Threading.Thread.CurrentThread.ManagedThreadId}");
            System.Threading.Thread.Sleep(1000); // 模拟耗时操作
        });

        Console.WriteLine("并行处理完成");
    }
}

上述代码中,即使系统支持更多并发线程,Parallel.For循环最多只会同时运行4个任务,避免资源过度消耗。

CancellationToken的作用与用法

CancellationToken用于实现并行任务的取消逻辑,当外部触发取消请求时,正在执行的并行任务可以感知到取消信号并安全终止。使用CancellationToken需要搭配CancellationTokenSource来创建取消令牌。

下面是一个使用CancellationToken取消并行操作的示例:

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        // 创建取消令牌源
        CancellationTokenSource cts = new CancellationTokenSource();
        ParallelOptions options = new ParallelOptions
        {
            CancellationToken = cts.Token
        };

        // 启动一个线程用于触发取消请求,3秒后取消
        Task.Run(() =>
        {
            Thread.Sleep(3000);
            cts.Cancel();
            Console.WriteLine("已触发取消请求");
        });

        try
        {
            Parallel.For(1, 101, options, (i) =>
            {
                // 检查是否收到取消请求
                options.CancellationToken.ThrowIfCancellationRequested();
                Console.WriteLine($"正在处理数字 {i}");
                Thread.Sleep(500); // 模拟耗时操作
            });
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("并行操作已被取消");
        }
    }
}

代码中我们通过CancellationTokenSource在3秒后触发取消请求,并行任务在执行时会检查取消信号,一旦收到信号就会抛出OperationCanceledException,终止整个并行操作。

两个属性搭配使用

在实际开发中,我们经常会同时用到MaxDegreeOfParallelism和CancellationToken,既限制并发数量,又支持任务取消。下面是搭配使用的示例:

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        CancellationTokenSource cts = new CancellationTokenSource();
        ParallelOptions options = new ParallelOptions
        {
            MaxDegreeOfParallelism = 3, // 最大并发3个任务
            CancellationToken = cts.Token // 关联取消令牌
        };

        // 2秒后触发取消
        Task.Run(() =>
        {
            Thread.Sleep(2000);
            cts.Cancel();
        });

        try
        {
            Parallel.ForEach(new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, options, (item) =>
            {
                options.CancellationToken.ThrowIfCancellationRequested();
                Console.WriteLine($"处理元素 {item},线程ID:{Thread.CurrentThread.ManagedThreadId}");
                Thread.Sleep(1000);
            });
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("并行操作已取消");
        }
    }
}

使用注意事项

  • MaxDegreeOfParallelism设置为0或负数(除了-1)会导致运行时异常,只有-1表示由系统自动分配并发数。
  • 使用CancellationToken时,一定要在并行任务内部调用ThrowIfCancellationRequested方法或者检查IsCancellationRequested属性,否则即使触发了取消请求,任务也不会停止。
  • 如果并行操作中涉及共享资源的修改,即使设置了MaxDegreeOfParallelism,也需要考虑线程安全问题,必要时添加同步锁。
  • 取消并行操作后,已经启动的任务会尽量完成当前迭代,不会强制终止正在执行的线程,而是通过异常的方式通知调用方操作已取消。

C#ParallelOptionsMaxDegreeOfParallelismCancellationToken修改时间:2026-06-27 12:48:28

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。