C# Parallel类多线程编程实战:顺序与并行对比
本文通过C#代码实例讲解如何利用 System.Threading.Tasks.Parallel 类实现多线程并行处理,包含顺序执行与并行调用的对比测试。
Parallel类基础应用
C#中的 System.Threading.Tasks.Parallel 类提供了简化并行编程的API。在实际开发中,Parallel.Invoke 是最常用的方法之一,它可以接收多个 Action 委托并并行执行。
第1步:准备并发环境参数
为了观察多线程的执行状态,需要获取当前线程的ID以及所在的处理器的编号。以下代码展示了如何声明必要的静态变量和P/Invoke入口:
using System;
using System.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Threads
{
class Program
{
// 导入内核函数以获取当前处理器编号
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int GetCurrentProcessorNumber();
private static int criticalSection = 0;
private static object lockObject = new object();
// ... Main 方法见下方代码块
}
}
第2步:编写顺序执行逻辑
首先,定义一个模拟耗时操作的 Target 方法。该方法内部使用 lock 关键字保护临界区,确保对共享变量 criticalSection 的访问是安全的。
private static void Target()
{
Thread.Sleep(2000); // 模拟2秒耗时操作
lock (lockObject)
{
criticalSection++;
Console.WriteLine(string.Format(
"Thread ID: {0} and Processor ID: {1} Critical Variable Value: {2}",
Thread.CurrentThread.ManagedThreadId,
GetCurrentProcessorNumber(),
criticalSection));
}
}
第3步:实现与对比两种调用方式
在 Main 方法中,分别进行8次顺序调用和8次并行调用,观察控制台的输出差异。顺序调用是阻塞式的,而并行调用会尝试利用多核CPU同时执行。
static void Main(string[] args)
{
// 1. 顺序执行测试
Console.WriteLine("==================Sequential calls==============");
for(int i=0; i<8; i++) Target();
// 2. 并行执行测试
Console.WriteLine("\n==================Parallel calls==============");
Action action = new Action(Target);
Parallel.Invoke(new Action[] {
action, action, action, action,
action, action, action, action
});
Console.ReadKey();
}
运行上述代码可以发现:
- 在 Sequential 模式下,总耗时约为 2000ms × 8 = 16000ms(约16秒),且所有线程可能在同一处理器上切换。
- 在 Parallel 模式下,任务被分配到可用的核心上并行执行,总耗时接近 2000ms + 少量调度开销,但输出的 Critical Variable Value 顺序可能不固定,因为多线程竞争锁的顺序是非确定的。
注意事项
Parallel.Invoke 适用于计算密集型且彼此无依赖的任务集合。如果任务之间存在复杂的先后依赖关系,应优先考虑使用 TPL Dataflow 或基于 Task 的组合策略。此外,务必注意临界区的粒度,过长的 lock 范围可能导致线程饥饿或性能下降。
以上就是C#使用Parallel类进行多线程编程的详细教程,更多关于C#并发编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









