RegisterWaitForSingleObject vs AutoResetEvent

时间:2011-08-10 10:03:46

标签: .net multithreading

我已经阅读过RegisterWaitForSingleObject: http://www.albahari.com

我不明白何时我更喜欢使用AutoResetEvent而不是RegisterWaitForSingleObject?

似乎我们总是可以使用RegisterWaitForSingleObject,它比AutoResetEvent更好,因为它不依赖于线程。

1 个答案:

答案 0 :(得分:3)

您正在比较苹果和橙子。 RWFSO需要一个等待句柄。像AutoResetEvent一样。 RWFSO所做的是优化事件的等待。没有它,你需要调用事件的WaitXxx()方法。

Caling WaitOne()阻塞线程,直到事件为Set()。这是您希望在线程池线程中避免的,因为阻塞的TP线程会阻止其他预定的TP线程快速执行。线程池管理器尝试优化正在运行的TP线程的数量,因此不再有CPU线程执行TP线程。一个阻塞的线程有点搞砸了,管理员不够聪明,不知道线程阻塞的原因。只有当阻塞TP线程没有进行半秒时,管理器才允许执行另一个等待的TP线程。

RWFSO相当不错,但肯定不合适。用它编程是相当尴尬的,特别是当你想处理异常时。如果您需要取消它,那就是一场讨厌的隐性竞赛。发出事件信号时运行的TP线程受到相同类型的TP调度延迟的影响。并且没有RegisterWaitForMultipleObjects(),线程通常需要使用WaitAny()。直观地:在一个事件上告诉线程一些东西准备就绪,另一个事件告诉线程退出。

相关问题