我想要一个函数在一个线程上连续检查新添加的队列
显然,有一个连续循环的睡眠选项,但我想要的东西不那么浪费.
我考虑了某种类型的等待句柄,然后让队列发出信号,但是我不能安全地覆盖入队,因为它不是虚拟的.
现在我正在考虑封装Queue< T>作为我最好的选择,但我想问你好人是否有更好的一个!
这个想法是:我希望许多线程访问套接字连接,同时保证他们只读取其消息的响应,所以我要有一个线程调度和读取响应,然后使用响应数据(纯文本)执行回调,
解决方法
尝试阻塞队列:
Creating a blocking Queue<T> in .NET?
基本思想是当您调用TryDequeue时,它将阻塞,直到有一些队列中的东西.正如你可以看到阻塞队列的“美”是你不必轮询/睡觉或做任何类似的事情…它是生产者/消费者模式的基础骨干.
我的版本的阻塞队列是:
public class BlockingQueue<T> where T : class { private bool closing; private readonly Queue<T> queue = new Queue<T>(); public int Count { get { lock (queue) { return queue.Count; } } } public BlockingQueue() { lock (queue) { closing = false; Monitor.PulseAll(queue); } } public bool Enqueue(T item) { lock (queue) { if (closing || null == item) { return false; } queue.Enqueue(item); if (queue.Count == 1) { // wake up any blocked dequeue Monitor.PulseAll(queue); } return true; } } public void Close() { lock (queue) { if (!closing) { closing = true; queue.Clear(); Monitor.PulseAll(queue); } } } public bool TryDequeue(out T value,int timeout = Timeout.Infinite) { lock (queue) { while (queue.Count == 0) { if (closing || (timeout < Timeout.Infinite) || !Monitor.Wait(queue,timeout)) { value = default(T); return false; } } value = queue.Dequeue(); return true; } } public void Clear() { lock (queue) { queue.Clear(); Monitor.Pulse(queue); } } }
非常感谢Marc Gravell这个!