ThreadPool挫折 - 线程创建超过SetMaxThreads

Mik*_*ike 5 c# multithreading threadpool

  • 我有一个I/O密集型操作.
  • 我只希望一次运行5个线程的MAX.
  • 我有8000个任务要排队并完成.
  • 每项任务大约需要15-20秒才能执行.

我看了一下ThreadPool,但是

        ThreadPool.SetMaxThreads(5, 0);

        List<task> tasks = GetTasks();

        int toProcess = tasks.Count;
        ManualResetEvent resetEvent = new ManualResetEvent(false);

        for (int i = 0; i < tasks.Count; i++)
        {
            ReportGenerator worker = new ReportGenerator(tasks[i].Code, id);
            ThreadPool.QueueUserWorkItem(x =>
            {
                worker.Go();
                if (Interlocked.Decrement(ref toProcess) == 0)
                    resetEvent.Set();
            });
        }

        resetEvent.WaitOne();
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么...我的代码一次执行超过5个线程.我试过setmaxthreads,setminthreads,但它一直执行超过5个线程.

怎么了?我错过了什么?我应该以另一种方式这样做吗?

谢谢

小智 6

SetMaxThreads 有一个限制,您永远不能将其设置为低于系统上的处理器数量。如果您有 8 个处理器,将其设置为 5 与根本不调用该函数相同。

  • 这是来自 [MSDN](https://learn.microsoft.com/en-us/dotnet/api/system.threading.threadpool.setmaxthreads) 的引用:````您无法设置最大工作线程数或 I/ O 完成线程的数量小于计算机上处​​理器的数量。要确定存在多少个处理器,请检索 Environment.ProcessorCount 属性的值。``` (2认同)

Dmi*_*ski 5

任务并行库可以帮助您:

List<task> tasks = GetTasks();

Parallel.ForEach(tasks, new ParallelOptions { MaxDegreeOfParallelism = 5 }, 
  task => {ReportGenerator worker = new ReportGenerator(task.Code, id); 
           worker.Go();});
Run Code Online (Sandbox Code Playgroud)

MaxDegreeOfParallelism有什么作用?