0

0

c# Parallel.Invoke 的用法 c#如何并行执行多个方法

月夜之吻

月夜之吻

发布时间:2026-01-20 11:15:16

|

716人浏览过

|

来源于php中文网

原创

Parallel.Invoke 是 .NET 中一次性并行执行多个无返回值、无依赖关系 Action 委托的方法,适用于日志写入、缓存刷新等彼此独立的任务;不适用于需返回值、顺序控制或并发限制的场景。

c# parallel.invoke 的用法 c#如何并行执行多个方法

Parallel.Invoke 是什么,什么时候该用它

Parallel.Invoke 是 .NET 中用于**一次性并行执行多个无返回值、无依赖关系的 Action 委托**的便捷方法。它适合“几个独立任务,谁先做完谁先走”的场景,比如同时写日志、刷新缓存、发送通知——彼此不传参、不等结果、也不共享可变状态。

它不是万能替代 Task.RunParallel.ForEach 的方案。如果任务需要返回值、有执行顺序要求、或要控制并发数,Parallel.Invoke 反而会掩盖问题。

基本用法和参数传递陷阱

直接传入多个 Action 即可,但要注意闭包捕获变量的问题:

int i = 0;
Parallel.Invoke(
    () => Console.WriteLine($"Task A: {i}"),
    () => Console.WriteLine($"Task B: {i}"),
    () => { i = 42; Console.WriteLine("Task C done"); }
);

上面代码中,A 和 B 极可能都输出 0(取决于调度时机),但 C 修改了 i,而 A/B 并不感知——这不是线程安全问题,而是典型的**变量捕获时机错误**。

正确做法是为每个委托提供独立副本:

  • let 式局部变量(C# 7+):var localI = i; () => Console.WriteLine(localI);
  • 避免在 lambda 外部修改被闭包捕获的变量
  • 若需共享状态,改用 ConcurrentDictionaryInterlocked 等线程安全类型

异常处理:一个失败,全部中断

Parallel.Invoke 内部使用 AggregateException 包装所有子任务异常。只要任一委托抛出异常,其余正在运行的任务会被取消(尽力而为),且最终只抛出一个 AggregateException

PHP的使用技巧集
PHP的使用技巧集

PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。它可以比 CGI或者Perl更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多。下面介绍了十个PHP高级应用技巧。 1, 使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里

下载

这意味着:

  • 不能靠 try/catch 单个 lambda 来隔离错误
  • 必须在外层 catch AggregateException,再遍历 .InnerExceptions 处理
  • 若某个任务耗时很长且已出错,其他短任务也会被强行终止——这不是“超时控制”,而是“故障传播”
try
{
    Parallel.Invoke(
        () => { throw new InvalidOperationException("First fail"); },
        () => Thread.Sleep(2000) // 这个会被中断
    );
}
catch (AggregateException ae)
{
    foreach (var ex in ae.InnerExceptions)
    {
        Console.WriteLine(ex.Message);
    }
}

性能与替代方案对比

Parallel.Invoke 底层复用 ThreadPool,启动开销小,但缺乏细粒度控制:

  • 无法设置最大并行度(MaxDegreeOfParallelism),默认由调度器决定
  • 不支持取消令牌(CancellationToken)直接传入——得手动在每个 Action 里检查
  • 比手写 Task.Run + Task.WhenAll 更简洁,但后者能统一 await、支持返回值、天然集成取消逻辑

简单并行调用,Parallel.Invoke 足够;一旦需求变复杂(比如要等全部完成再做下一步、要限制最多跑 3 个、要记录每个结果),就该切到 Task.WhenAllParallelOptions 配合 Parallel.ForEach

真正容易被忽略的是:它不保证执行顺序,也不保证 CPU 密集型任务一定更快——如果所有任务都在争抢同一块锁或磁盘 I/O,加并行反而更慢。

相关专题

更多
php中foreach用法
php中foreach用法

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

44

2025.12.04

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

49

2026.01.05

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

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

481

2023.08.10

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

135

2025.07.29

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

412

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

496

2024.05.29

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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