我怎样才能将WaitHandle子类化?

sch*_*wrz 1 c# multithreading

是否有可能(以有意义的方式)?

例如,假设我想实现一个可等待的队列,如下所示:

public class WaitableQueue : WaitHandle {
    public WaitableQueue() {
      q = new Queue();
    }

    public void Enqueue(Object Arg) {
      lock(this) {
        q.Enqueue(Arg);
        // set the waithandle here (how?)
      }
    }

    public Type Dequeue() {
      lock(this) {
        if(q.Count == 1)
        // reset the waithandle here (how?)
        return q.Dequeue();
      }
    }

    Queue q;
  }
Run Code Online (Sandbox Code Playgroud)

Bri*_*eon 7

要记住的重要一点是你必须设置SafeWaitHandle属性.

来自MSDN:

从WaitHandle派生时,使用SafeWaitHandle属性来存储本机句柄操作系统句柄.除非使用其他非托管资源,否则无需覆盖受保护的Dispose方法.

我就是这样做的.

public class QueueWaitHandle<T> : WaitHandle
{
    private Queue<T> queue = new Queue<T>();
    private ManualResetEvent signal = new ManualResetEvent(false);

    public QueueWaitHandle()
    {
        base.SafeWaitHandle = signal.SafeWaitHandle;
    }

    public void Enqueue(T item)
    {
        lock (queue)
        {
            queue.Enqueue(item);
            signal.Set();
        }
    }

    public T Dequeue()
    {
        lock (queue)
        {
            T item = queue.Dequeue();
            if (queue.Count == 0)
            {
                signal.Reset();
            }
            return item;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做时Enqueue就像Set方法Dequeue一样,就像Reset方法一样.所以基本上这就像一个计数事件,其中非零信号,零无信号.在这种情况下,队列正在进行计数,它恰好也会保存数据.

我知道你WaitHandle一般都在询问子类化,但这个特定的数据结构不仅仅是一个练习.它在某些情况下很有用.但是,我不会将其称为可等待队列,因为这至少对我来说意味着Dequeue当队列为空时操作将阻塞.显然,这不是在这个特定实现中会发生的事情.