C# 在受限WaitHandle中包装AutoResetEvent对象?

C# 在受限WaitHandle中包装AutoResetEvent对象?,c#,.net,waithandle,autoresetevent,C#,.net,Waithandle,Autoresetevent,我构建了一个库,它启动一个线程来完成它的任务,并向调用者返回一个WaitHandle 查看一个bug报告,我怀疑调用我的库的代码是将返回的对象转换为一个自动resetEvent,并将其自身提升。这不是故意的 有没有一种方法可以将AutoResetEvent对象包装为一个仍然可以WaitOne'd和WaitAny'd,但只能由我的代码引发的对象 谢谢。您可以创建一个从EventWaitHandle派生的新类,并重写Set和Reset,使它们不做任何操作,或引发异常。实际上,您必须创建新的实现,因为

我构建了一个库,它启动一个线程来完成它的任务,并向调用者返回一个WaitHandle

查看一个bug报告,我怀疑调用我的库的代码是将返回的对象转换为一个自动resetEvent,并将其自身提升。这不是故意的

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


谢谢。

您可以创建一个从EventWaitHandle派生的新类,并重写Set和Reset,使它们不做任何操作,或引发异常。实际上,您必须创建新的实现,因为Set和Reset不是虚拟的。当然,您必须创建自己的、其他命名方法。比如MyInternalSet和MyInternalReset。可能,但我不建议你这么做

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

您可以创建一个WaitHandle派生类,将AutoResetEvent作为内部属性保存。客户端代码将无法访问它。比如:

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();
    }
}
您必须重写受保护的DisposeBoolean方法,以便它处理内部句柄,并且您还需要另一个WaitOne重载。然后,您可以创建Set和Reset的内部实现,或者让代码调用InternalHandle.Set


我仍然认为最好的做法是告诉客户不要这样做。但是如果你必须阻止它,上面的方法应该会起作用。

我不打算把它作为一个答案,因为它不能直接解决你的问题。。。但更好的解决方案可能是返回bug报告并将其标记为预期行为。听起来你们图书馆的消费者在做他们不该做的坏事。我想了想,但他们坚持说他们没有这样做。但是我能重新创建bug的唯一方法是在错误的时间未经授权地引发事件。外交规则!很明显,您得到了一些多线程代码,可以在您的机器上工作,但不能在另一台机器上工作。这很正常。我想知道WaitHandle.WaitAny是否会使用我的WaitOne覆盖。是时候做实验了!谢谢你的深入回答。