gpt4 book ai didi

c# - 我如何继承 WaitHandle?

转载 作者:太空宇宙 更新时间:2023-11-03 17:33:59 26 4
gpt4 key购买 nike

这可能(以一种有意义的方式)吗?

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

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;
}

最佳答案

要记住的重要一点是,您必须设置 SafeWaitHandle 属性。

来自 MSDN:

When you derive from WaitHandle, use the SafeWaitHandle property to store your native handle operating system handle. You do not need to override the protected Dispose method unless you use additional unmanaged resources.

这是我将如何做到这一点。

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;
}
}
}

以这种方式完成后,Enqueue 的行为类似于Set 方法,Dequeue 的行为类似于Reset 方法。所以基本上这就像一个计数事件,其中发出非零信号,零信号不发出信号。在这种情况下,队列正在进行计数,它恰好也保存数据。

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

关于c# - 我如何继承 WaitHandle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8356962/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com