0

0

C#的并行编程是什么?如何使用?

月夜之吻

月夜之吻

发布时间:2025-09-16 10:30:01

|

782人浏览过

|

来源于php中文网

原创

C#的并行编程通过Parallel类、Task和PLINQ实现多任务同时处理,提升性能。Parallel类适用于独立循环迭代的并行化,如Parallel.ForEach和Parallel.For;Task用于异步操作,配合Task.Run将耗时任务放入线程池,结合async/await保持程序响应性;PLINQ通过.AsParallel()将LINQ查询并行化,适合计算密集型数据处理,可提升大数据集的处理效率。

c#的并行编程是什么?如何使用?

C#的并行编程,简单来说,就是让你的程序能够同时处理多个任务,从而更充分地利用现代多核处理器的计算能力,以达到提升性能和响应速度的目的。它不是让你的代码“更快”地执行一个任务,而是让它能够“同时”处理多个独立的任务,就像一个团队分工合作,而不是一个人从头到尾包揽所有工作。这背后的核心思想,就是把一个大问题拆解成若干个可以独立解决的小问题,然后让它们并行运行。

解决方案

在C#中,实现并行编程主要依赖于.NET框架提供的

System.Threading.Tasks
命名空间下的工具,尤其是
Parallel
类、
Task
和PLINQ。

  • Parallel类: 这是最直接、最易用的并行化工具,特别适合处理循环中的独立迭代。当你有一个

    for
    循环或
    foreach
    循环,并且每次迭代的操作互不依赖时,
    Parallel.For
    Parallel.ForEach
    能让你以最少的代码改动实现并行化。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Collections.Concurrent; // 用于线程安全集合
    
    public class ParallelExample
    {
        public static void Run()
        {
            List numbers = Enumerable.Range(1, 1_000_000).ToList();
            ConcurrentBag results = new ConcurrentBag(); // 使用线程安全集合
    
            Console.WriteLine("开始使用 Parallel.ForEach 处理大量数据...");
    
            Parallel.ForEach(numbers, num =>
            {
                // 模拟一个耗时的计算操作
                double res = Math.Sqrt(num * num + num);
                // 注意:这里使用ConcurrentBag是线程安全的,如果使用List.Add()则需要加锁
                results.Add(res);
            });
    
            Console.WriteLine($"Parallel.ForEach 完成,处理了 {results.Count} 个元素。");
    
            // 也可以使用Parallel.For
            double[] arrayResults = new double[1_000_000];
            Parallel.For(0, numbers.Count, i =>
            {
                arrayResults[i] = Math.Sqrt(numbers[i] * numbers[i] + numbers[i]);
            });
            Console.WriteLine($"Parallel.For 完成,处理了 {arrayResults.Length} 个元素。");
        }
    }

    这里有个小陷阱,如果你在

    Parallel.ForEach
    内部修改共享数据(比如一个普通的
    List
    ),就必须小心处理线程同步问题,否则很可能出现竞态条件导致数据损坏或异常。我这里用了
    ConcurrentBag
    ,它就是专门为多线程环境设计的线程安全集合,能省去手动加锁的麻烦。

    手机在线人工冲值
    手机在线人工冲值

    说明:我不知道这个系统还能用到什么地方!他的运作方式是这样的,客户在其他地方比如掏宝购买了 你得卡,然后在你的网站进行冲值,你得有人登陆并看着后台,如果有人冲值,就会刷出记录,手工冲值完毕后,你得点击 [冲值完毕],客户的页面 就会返回 冲值信息!安装:上传所有文件,倒入(sql.txt)mysql数据库,使用myphpadminphplib 777phplib/sys.php 777phplib

    下载
  • Task和Task.Run:

    Task
    是.NET中表示一个异步操作的核心抽象。
    Task.Run
    则是一个非常方便的辅助方法,它能将你提供的同步方法(lambda表达式或委托)提交到线程池中执行,并返回一个
    Task
    对象,你可以用它来跟踪操作的完成情况或获取结果。这对于将耗时操作从主线程(比如UI线程)卸载到后台线程,以保持应用响应性非常有用。

    public class TaskExample
    {
        public static async Task Run()
        {
            Console.WriteLine("主线程开始执行...");
    
            // 启动一个后台任务,模拟耗时的数据获取
            Task fetchDataTask = Task.Run(() =>
            {
                Console.WriteLine($"Task {Task.CurrentId} 开始模拟获取数据...");
                Thread.Sleep(2500); // 模拟2.5秒的耗时操作
                Console.WriteLine($"Task {Task.CurrentId} 模拟获取数据完成。");
                return "这是从模拟远程服务获取的数据";
            });
    
            Console.WriteLine("主线程继续执行其他操作,不被阻塞...");
    
            // 启动多个任务并行执行
            List tasks = new List();
            for (int i = 0; i < 3; i++)
            {
                int taskId = i + 1; // 捕获变量
                tasks.Add(Task.Run(() =>
                {
                    Console.WriteLine($"任务 {taskId} 开始执行...");
                    Thread.Sleep(new Random().Next(1000, 3000)); // 随机耗时
                    Console.WriteLine($"任务 {taskId} 执行完成。");
                }));
            }
    
            // 等待所有并行任务完成
            await Task.WhenAll(tasks);
            Console.WriteLine("所有并行任务都完成了。");
    
            // 等待第一个任务完成并获取结果
            string data = await fetchDataTask; // await会非阻塞地等待任务完成
            Console.WriteLine($"主线程获取到数据: {data}");
    
            Console.WriteLine("主线程所有操作完成。");
        }
    }

    Task
    的强大之处在于它与
    async/await
    关键字的结合,这让异步编程变得非常自然和易读。你可以用
    await
    来等待一个
    Task
    完成,而不会阻塞当前线程,这对于构建响应式UI或高并发的Web服务至关重要。

  • PLINQ (Parallel LINQ): 如果你的项目中大量使用了LINQ查询,并且这些查询是计算密集型的,PLINQ能让你以声明式的方式轻松实现并行化。你只需要在LINQ查询的开头加上一个

    .AsParallel()
    方法。

    public class PLINQExample
    {
        public static void Run()
        {
            List bigNumbers = Enumerable.Range(1, 20_000_000).ToList();
    
            Console.WriteLine("开始使用 PLINQ 进行并行查询...");
    
            // 使用AsParallel()将LINQ查询并行化
            var evenNumbersParallel = bigNumbers.AsParallel()
                                                .Where(n => n % 2 == 0)
                                                .Select(n => n * 2) // 模拟一些计算
                                                .ToList();
    
            Console.WriteLine($"PLINQ 找到并处理了 {evenNumbersParallel.Count} 个偶数。");
    
            // 也可以控制并行度
            var limitedParallel = bigNumbers.AsParallel()
                                            .WithDegreeOfParallelism(Environment.ProcessorCount / 2) // 只用一半的核心
                                            .Where(n => n % 3 == 0)
                                            .ToList

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

47

2025.12.04

lambda表达式
lambda表达式

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

205

2023.09.15

python lambda函数
python lambda函数

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

190

2025.11.08

Python lambda详解
Python lambda详解

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

49

2026.01.05

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

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

482

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

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

5

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

7

2026.01.21

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

6

2026.01.22

热门下载

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

精品课程

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

共28课时 | 3.4万人学习

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号