更具体地说,上下文切换的性能下降是否适用于处于等待状态的线程?
在什么条件或情况下,ManualResetEvent或WaitHandle可能会消耗资源?
答案 0 :(得分:5)
ManualResetEvent没有等待状态。可以在MRE上等待的唯一事情是线程。是的,当一个线程不执行它所做的事情,执行代码时,它会不必要地消耗大量宝贵的资源。一兆字节的虚拟内存和一些内核对象。与之相比,MRE消耗的单个内核对象是小土豆。
您通常希望使用线程池线程。
看看.NET 4.0中可用的内容。像ManualResetEventSlim(不基于OS对象)和Task类。
答案 1 :(得分:2)
对于ManualResetEvent,没有。线程实际上并不是循环,也不是任何东西。它只是引用了自己填充到ManualResetEvent的通知列表中。当另一个线程在ManualResetEvent上调用.Set时,另一个线程最终将等待的线程放回到活动队列中。
消耗的资源只是对线程存在的计算:堆栈,记录的内核资源,保存的寄存器等等。现在,如果你所说的线程没有使用ManualResetEvent,而是某种等待循环,然后肯定。
现在,WaitHandle不是一个实现。这是一个抽象的API。没有人知道WaitHandle的其他实现如何起作用。