C# Parallel设置最大并发度

背景

以前用Parallel都是直接用,今天在处理pdf时发现不是很快,特别是有时居然卡死了,异常是有处理的,但没有爆出来,不知道问题在哪。

老老实实不用多线程,一个多小时觉得还是太累。

用的话,部分文件又生成不出来。

想了下,可能还是并发度太高导致的。

个人电脑,物理核心是6个,虚拟处理器12个。

设置成 6,47分钟运行完毕。

把并发度改成了跟cpu物理核心一样,才是合理的。

直接贴示例代码

using System;
using System.Diagnostics;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        Stopwatch stopwatch = new Stopwatch();
        stopwatch.Start();

        // 获取虚拟处理器数量, 并行度设定为虚拟处理器/2,让一些给其它任务
        int physicalCoreCount = Environment.ProcessorCount;
        int parallelCount = physicalCoreCount / 2;
        Console.WriteLine("虚拟处理器数量:{0}, 并行度:{1}", physicalCoreCount, parallelCount);
        // 设置并行度
        var options = new ParallelOptions { MaxDegreeOfParallelism = parallelCount };

        // 使用并行度为 虚拟处理器/2 的并行循环
        Parallel.ForEach(numbers, options, number =>
        {
            DoSomeWork(number);
        });

        stopwatch.Stop();
        Console.WriteLine($"Elapsed time: {stopwatch.ElapsedMilliseconds} ms");

        Console.ReadLine();
    }

    private static void DoSomeWork(int number)
    {
        // 模拟工作负载
        System.Threading.Thread.Sleep(100); // 暂停线程以模拟工作
        Console.WriteLine($"Processing number {number} on thread {System.Threading.Thread.CurrentThread.ManagedThreadId}");
    }
}

后记:

我前面说的卡死,是控制台一直没有显示,后来改为6个,也还是有这种情况,按了一个ctrl+c,控制台一下子爆出好多的输出,而且没有退出。
可能是程序运行时忽略了控制台这块,并不是并发的问题。

但在程序运行时,无论任务有多繁重,如何让控制台一直有输出,这也是个问题。

可以立即刷新输出缓冲区。

Console.WriteLine("这是输出的消息");
Console.Out.Flush(); // 立即刷新输出缓冲区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值