C# 创建大量系统线程并等待MRE的影响?

C# 创建大量系统线程并等待MRE的影响?,c#,.net,multithreading,threadpool,manualresetevent,C#,.net,Multithreading,Threadpool,Manualresetevent,我正在尝试修复一个非常大的应用程序中的内存峰值。虽然我不确定这会对记忆产生多大影响,但我注意到以下几点: 应用程序使用自定义线程池来执行所有昂贵的任务 应用程序将执行所有传入任务 任务可以由数千个子任务组成 虽然线程池一次只执行{T}个任务,并在启动新任务之前完全完成任务,但它确实会创建一个新的系统线程(线程类),并为添加到其中的每个子任务启动它 子任务系统线程以线程启动方式启动,该线程启动会立即阻止等待线程池插槽释放的手动重置事件(MRE) 因此,这个线程池可以创建数千个线程,但是当其他任

我正在尝试修复一个非常大的应用程序中的内存峰值。虽然我不确定这会对记忆产生多大影响,但我注意到以下几点:

  • 应用程序使用自定义线程池来执行所有昂贵的任务
  • 应用程序将执行所有传入任务
  • 任务可以由数千个子任务组成
  • 虽然线程池一次只执行{T}个任务,并在启动新任务之前完全完成任务,但它确实会创建一个新的系统线程(线程类),并为添加到其中的每个子任务启动它
  • 子任务系统线程以线程启动方式启动,该线程启动会立即阻止等待线程池插槽释放的手动重置事件(MRE)
因此,这个线程池可以创建数千个线程,但是当其他任务完成时,除了30个线程(或您配置的任何线程)之外的所有线程都将在MRE上被阻塞

我的问题:


MRE上的1000个线程阻塞会对内存/处理器产生什么影响?我没有太多的时间来修复这个峰值,所以如果它是最小的,我宁愿留下这个问题,并在以后有更多时间的补丁中修复它

另外,这种行为是线程池中的典型行为,还是听起来有缺陷(我倾向于有缺陷,但我没有足够好的背景来确定)

MRE上的1000个线程阻塞会对内存/处理器产生什么影响?我没有太多的时间来修复这个峰值,所以如果它是最小的,我宁愿留下这个问题,并在以后有更多时间的补丁中修复它

当手动创建时,每个线程都有自己的堆栈分配给它。默认情况下,每个线程的容量为1MB,但也可以这样做

根据问题的描述,您最好重新设计它,使用标准ThreadPool和类似
BlockingCollection
的类来处理节流。这是为了直接允许边界输入而设计的,带有块。与使用框架中包含的高度调优的线程池相比,为无限多的线程创建自定义“线程池”的效率要低得多

另外,这种行为是线程池中的典型行为,还是听起来有缺陷(我倾向于有缺陷,但我没有足够好的背景来确定)


这绝对是有缺陷的。线程池的整个要点是避免为每个请求创建一个线程,并为多个请求“池”线程(重用它们),而不必重新创建它们。

“任务管理器不显示它们(我认为它只显示活动线程)。”我希望不显示-我的TM当前显示1090个线程。我不是说线程本身正在积极运行;我的意思是,我认为它不会显示当前没有争夺处理器的线程。如果你在一个应用程序中创建了500个线程,并将它们全部与MRE一起休眠,那么你的应用程序在任务管理器中还会有500多个线程吗(老实说,我不确定,但从我看到的情况来看并非如此)?如果你的系统为每个子任务都创建了新线程,那听起来就不像是一个“池”。我同意;错误的遗留代码。永远不会少-你知道这对内存占用和处理器使用的长期影响吗?@wOOte-是的。如果我创建2000个线程并将其全部阻塞,则TM显示我的应用程序有2001个线程,CPU使用率为0%。