在一些继承的C#winforms代码中,我有一个泄漏的句柄问题(“没有足够的配额可用于处理此命令”),所以我去了并使用Sysinternals的Handle工具来追踪它。事实证明,这是事件处理程序泄漏,所以我试图用Google搜索它(花了几个尝试找到一个query,没有返回“你的意思是:事件处理程序?”)。根据Junfeng Zhang,通过使用Monitor生成事件句柄,并且就事件句柄处理和同步原语而言,可能存在一些奇怪的规则。什么是事件句柄?
我不完全确定,我的泄漏句柄的来源完全是由于长寿命的对象调用大量同步的东西,因为此代码也处理HID接口和大量的win32编组和互操作,以及没有做任何我知道的同步。无论哪种方式,我只是要在windbg中运行这个函数,并开始追踪句柄的来源,并花费大量时间学习代码的这一部分,但我很难找到关于什么事件的信息手柄是第一位的。
事件内核对象的msdn page只是链接到通用同步概述......那么,什么是事件句柄,它们与互斥/信号/不管怎么样?
啊,所以他们几乎是相同的,只是与硬件驱动程序而不是软件一起使用的不同实现/语义。谢谢! – Tanzelax 2010-03-03 22:50:57
是的,这个继承的代码组件本质上是设备驱动程序(它直接调用hid.dll并返回设备的输入/输出包装),所以我相当确定问题出在这里,而不是任何硬件特质。 – Tanzelax 2010-03-03 23:08:19
@Preet:很酷...我希望我能再次为你回复这个答案,这真的很高兴知道。如果你想知道,这个问题最终只会导致你每天不处理正确的泄漏,但是我从中学到了很多东西。 :) – Tanzelax 2010-03-07 05:10:09