0

我已经建立了一个库,它启动一个线程来做这件事并将一个 WaitHandle 返回给调用者。

查看错误报告,我怀疑调用我的库的代码正在获取返回的对象并将其转换为 AutoResetEvent (它是)并提升标志本身。它不是为了这样做。

有没有一种方法可以将 AutoResetEvent 对象包装为仍然可以是 WaitOne'd 和 WaitAny'd 但只能由我的代码引发的对象?

谢谢。

4

1 回答 1

0

您可以创建一个派生自EventWaitHandle并覆盖的新类SetReset因此它们什么也不做,或者抛出异常。实际上,您必须创建new实现,因为Set并且Reset不是虚拟的。当然,您必须创建自己的、其他名称的方法。喜欢MyInternalSetMyInternalReset。可能,但我不建议这样做。

相反,我会记录客户端不应设置或重置事件,因为这样做会导致不可预知的行为。

您可以创建一个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的实现,或者只是让您的代码调用。SetResetInternalHandle.Set

我仍然认为最好的做法是告诉客户不要这样做。但是,如果您必须阻止它,则上述方法应该有效。

于 2011-06-10T23:30:22.637 回答