C# Parallel类多线程编程实战:顺序与并行对比

小鹿同学
小鹿同学
发布时间:2026-10-13| 4人浏览过
原创

本文通过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#并发编程的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。