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

发布于:2025-09-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

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

// 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)

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

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

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

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

关键特征:

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

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

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

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

技术实现:

1.Parallel类

// 数据并行处理
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)

// 大数据集并行查询
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.任务并行库

// 复杂计算任务的并行执行
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服务器、数据库

科学计算、图像处理