我已经建立了一个库,它启动一个线程来做这件事并将一个 WaitHandle 返回给调用者。
查看错误报告,我怀疑调用我的库的代码正在获取返回的对象并将其转换为 AutoResetEvent (它是)并提升标志本身。它不是为了这样做。
有没有一种方法可以将 AutoResetEvent 对象包装为仍然可以是 WaitOne'd 和 WaitAny'd 但只能由我的代码引发的对象?
谢谢。
我已经建立了一个库,它启动一个线程来做这件事并将一个 WaitHandle 返回给调用者。
查看错误报告,我怀疑调用我的库的代码正在获取返回的对象并将其转换为 AutoResetEvent (它是)并提升标志本身。它不是为了这样做。
有没有一种方法可以将 AutoResetEvent 对象包装为仍然可以是 WaitOne'd 和 WaitAny'd 但只能由我的代码引发的对象?
谢谢。
您可以创建一个派生自EventWaitHandle
并覆盖的新类Set
,Reset
因此它们什么也不做,或者抛出异常。实际上,您必须创建new
实现,因为Set
并且Reset
不是虚拟的。当然,您必须创建自己的、其他名称的方法。喜欢MyInternalSet
和MyInternalReset
。可能,但我不建议这样做。
相反,我会记录客户端不应设置或重置事件,因为这样做会导致不可预知的行为。
您可以创建一个WaitHandle
派生类,将您的AutoResetEvent
作为internal
属性。然后客户端代码将无法访问它。就像是:
public class MyWaitHandle: WaitHandle
{
internal AutoResetEvent InternalEvent { get; private set; }
internal MyWaitHandle(AutoResetEvent event)
{
InternalEvent = event;
}
public override bool WaitOne(int32 timeout)
{
return InternalEvent.WaitOne();
}
}
您必须重写受保护的Dispose(Boolean)
方法,以便它处理内部句柄,并且您还需要其他WaitOne
重载。然后,您可以创建andinternal
的实现,或者只是让您的代码调用。Set
Reset
InternalHandle.Set
我仍然认为最好的做法是告诉客户不要这样做。但是,如果您必须阻止它,则上述方法应该有效。