是否有可能(以有意义的方式)?
例如,假设我想实现一个可等待的队列,如下所示:
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)
要记住的重要一点是你必须设置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当队列为空时操作将阻塞.显然,这不是在这个特定实现中会发生的事情.