0

0

c# ParallelOptions 的 MaxDegreeOfParallelism 和 CancellationToken

煙雲

煙雲

发布时间:2026-01-18 12:17:02

|

281人浏览过

|

来源于php中文网

原创

设置 MaxDegreeOfParallelism = -1 会退回到默认行为,即按逻辑处理器数(通常为 Environment.ProcessorCount)动态调度;CancellationToken 仅阻止新任务启动,已运行任务需手动检查 token 才能响应取消。

c# paralleloptions 的 maxdegreeofparallelism 和 cancellationtoken

MaxDegreeOfParallelism 设置为 -1 会发生什么

它不会“不限制并发数”,而是退回到默认行为:.NET 运行时根据逻辑处理器数量动态决定线程数,通常是 Environment.ProcessorCount。设置 MaxDegreeOfParallelism = -1 等价于不设置该属性,不是“无上限”。真想压榨全部线程资源(比如 I/O 密集型场景),得明确设为一个足够大的正整数,但要注意这可能导致线程池饥饿。

CancellationToken 在 Parallel.ForEach 中如何真正生效

CancellationToken 不会自动中断正在执行的迭代项,只影响“是否启动新任务”。一旦某个 action 已开始运行,它必须自己检查 token.IsCancellationRequested 并主动退出。否则,即使调用 token.Cancel(),循环仍会等所有已派发的任务完成才返回。

LobeHub
LobeHub

LobeChat brings you the best user experience of ChatGPT, OLLaMA, Gemini, Claude

下载
  • 在循环体内部定期检查 token.ThrowIfCancellationRequested()if (token.IsCancellationRequested) return;
  • 避免在 long-running 同步操作(如 Thread.Sleep(5000))中忽略 token
  • 若使用 async 操作,Parallel.ForEach 本身不支持异步委托,需改用 Task.WhenAll + Partition 手动实现

ParallelOptions.MaxDegreeOfParallelism 和 CancellationToken 能一起用吗

能,而且推荐一起用——尤其在可控资源消耗 + 可中断的批处理场景中。但要注意两者作用域不同:MaxDegreeOfParallelism 控制并行“宽度”,CancellationToken 控制整体“生命周期”。它们互不干扰,但共同影响最终行为:

  • 设置 MaxDegreeOfParallelism = 4 后,最多同时跑 4 个迭代;此时调用 token.Cancel(),已运行的 4 个可能继续,但第 5 个起不再调度
  • 若某次迭代中抛出未捕获异常,Parallel.ForEach 默认立即停止调度新任务,并等待正在运行的完成(类似隐式 cancellation),但不会触发 CancellationToken 的回调
  • 不要依赖 CancellationToken 来“限流”,它不控制并发度;也不要靠 MaxDegreeOfParallelism 实现取消逻辑
var options = new ParallelOptions
{
    MaxDegreeOfParallelism = 3,
    CancellationToken = cts.Token
};

try
{
    Parallel.ForEach(items, options, item =>
    {
        // 必须手动检查
        cts.Token.ThrowIfCancellationRequested();

        // 模拟工作
        Thread.Sleep(100);

        // 若此处耗时且不可中断,Cancel() 就形同虚设
    });
}
catch (OperationCanceledException)
{
    // 只有在 ThrowIfCancellationRequested 触发时才会进这里
    Console.WriteLine("被取消了");
}
并发控制和取消信号是两个正交维度,混用时最容易漏掉的是“任务体内没查 token”——看起来设置了 CancellationToken,实际根本没响应。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

746

2023.08.22

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

42

2025.12.04

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6095

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

806

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1062

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1246

2024.03.01

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

61

2025.12.01

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.2万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

Sass 教程
Sass 教程

共14课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号