C#高并发与并行理解处理

目录

1.什么是IO密集型任务/CPU密集型任务

2.高并发概念和技术实现

2.并行(Parallelist)概念和技术实现

4.核心区别对比

1.什么是IO密集型任务/CPU密集型任务

1.IO密集型任务:

**定义:**任务核心逻辑不依赖CPU计算,而是大部分时间等待外部IO(指程序与外部设备(如:磁盘,网络,数据库,键盘鼠标)的数据交互)操作;

简单说:CPU在"等",没干活

核心特征:

等待事件远大于计算时间;

CPU利用率低:若用单线程处理IO密集型任务,CPU会频繁处于"空闲等待",资源浪费

并发价值高:可以通过多线程/异步,同时去处理其他任务,提高单位时间内任务吞吐量

注意:绝不用 "单线程同步":正确做法是用async/await异步,让 CPU "同时处理多个等待中的 IO 任务"。

异步的核心:"非阻塞等待"CPU无需等待IO完成,可继续处理其他任务,IO处理完成再回调处理结果,最大化CPU利用率。

2.CPU密集型任务

**定义:**CPU始终处于"满负荷工作"状态,直到计算完成;

核心特征:

计算时间远大于等待时间;

CPU利用率高:单线程处理时,CPU 会被 100% 占用(直到任务完成),但仅能利用一个 CPU 核心,多核 CPU 资源被浪费;那多线程和多核CPU是什么关系

并行价值高;

注意:CPU 密集型任务:绝不用 "大量线程并行"

若为 CPU 密集型任务创建远超 CPU 核心数的线程(如 16 核 CPU 创建 100 个线程),会导致线程频繁切换(上下文切换开销),反而降低计算效率。正确做法是用Parallel或控制线程数(如线程数 = CPU 核心数),避免切换浪费。

2.高并发概念和技术实现

概念:是指系统在单位时间内处理大量同时发生的请求或者任务的能力;

关键特征:

  • 🔁 ​​逻辑上的同时​​:通过时间片轮转模拟同时执行

  • ⚡ ​​I/O密集型​​:适合网络请求、文件操作、数据库访问

  • 🧵 ​​少量线程服务大量请求​​:线程数可能远大于CPU核心数

  • 🎯 ​​提高资源利用率​​:在等待I/O时释放线程处理其他任务

技术实现

1.asybc/await

cs 复制代码
// Web API 中的高并发处理
[ApiController]
public class ProductsController : ControllerBase
{
    [HttpGet("{id}")]
    public async Task<IActionResult> GetProduct(int id)
    {
        // 异步数据库查询 - I/O等待时线程可处理其他请求
        var product = await _dbContext.Products.FindAsync(id);
        
        // 异步调用外部API
        var reviews = await _httpClient.GetStringAsync($"https://api.reviews.com/products/{id}");
        
        return Ok(new { product, reviews });
    }
}

2.大量异步任务管理(使用SemaphoreSlim)

注:可对同时访问资源或者资源池的线程数加以限制;精细控制特定操作的并发度

cs 复制代码
// 限制数据库连接并发访问
var dbSemaphore = new SemaphoreSlim(10);
async Task QueryDatabase()
{
    await dbSemaphore.WaitAsync();
    try { /* 使用连接 */ }
    finally { dbSemaphore.Release(); }
}

2.并行(Parallelist)概念和技术实现

核心概念:并行是多核CPU真正同时执行多个计算任务;

关键特征:

  • ⚡ ​​物理上的同时​​:多个CPU核心同时工作

  • 🔢 ​​CPU密集型​​:适合数学计算、图像处理、数据分析

  • ⚖️ ​​任务数 ≈ CPU核心数​​:最大化利用计算资源

  • 🎯 ​​提高计算吞吐量​​:缩短总体计算时间

技术实现:

1.Parallel类

cs 复制代码
// 数据并行处理
public void ProcessImagesInParallel(List<Image> images)
{
    Parallel.ForEach(images, image =>
    {
        // 每个图像在独立CPU核心上处理
        image.Resize(800, 600);
        image.ApplyFilter(FilterType.Sharpen);
        image.SaveToDisk();
    });
    
    Console.WriteLine("所有图像处理完成");
}

2.PLINQ(并行LINQ)

cs 复制代码
// 大数据集并行查询
public List<Customer> FindHighValueCustomers(List<Customer> customers)
{
    return customers.AsParallel()
        .WithDegreeOfParallelism(Environment.ProcessorCount)
        .Where(c => c.TotalPurchases > 10000)
        .Where(c => c.IsActive)
        .OrderByDescending(c => c.TotalPurchases)
        .ToList();
}

3.任务并行库

cs 复制代码
// 复杂计算任务的并行执行
public async Task<double[]> ComputeComplexResultsAsync()
{
    var tasks = new Task<double>[4];
    
    // 同时执行多个计算任务
    tasks[0] = Task.Run(() => CalculatePi(1000000));
    tasks[1] = Task.Run(() => CalculateE(1000000));
    tasks[2] = Task.Run(() => CalculatePrimeNumbers(100000));
    tasks[3] = Task.Run(() => CalculateFibonacci(1000));
    
    return await Task.WhenAll(tasks);
}

4.核心区别对比

特性 高并发(Concurrency) 并行(Parallelism)
​目标​ 提高资源利用率 提高计算吞吐量
​执行方式​ 逻辑并发(交替执行) 物理并发(同时执行)
​适用场景​ I/O密集型操作 CPU密集型操作
​线程关系​ 线程数 ≫ 核心数 线程数 ≈ 核心数
​关键技术​ async/await, Task Parallel, PLINQ
​性能瓶颈​ I/O速度、网络延迟 CPU计算能力
​典型应用​ Web服务器、数据库 科学计算、图像处理
相关推荐
孤廖2 小时前
【算法磨剑:用 C++ 思考的艺术・Dijkstra 实战】弱化版 vs 标准版模板,洛谷 P3371/P4779 双题精讲
java·开发语言·c++·程序人生·算法·贪心算法·启发式算法
sali-tec2 小时前
C# 基于halcon的视觉工作流-章33-矩状测量
开发语言·人工智能·算法·计算机视觉·c#
王维志3 小时前
Unity Embedded Browser文档翻译
unity·c#
FlYFlOWERANDLEAF3 小时前
DevExpress中Word Processing Document API学习记录
学习·c#·word
酷炫码神3 小时前
第 2 篇:Java 入门实战(JDK8 版)—— 编写第一个 Java 程序,理解基础运行逻辑
java·开发语言·策略模式
像风一样自由20203 小时前
Go语言详细指南:特点、应用场景与开发工具
开发语言·后端·golang
半夏知半秋3 小时前
基于跳跃表的zset实现解析(lua版)
服务器·开发语言·redis·学习·lua
Wyc724093 小时前
Lua语言基础笔记
开发语言·笔记·lua
棉晗榜3 小时前
C#写字符串到Modbus中
c#·modbus