这不是关于我能或应该使用哪些不同方法来最好地利用队列,而是我看到一些毫无意义的事情正在发生。
void Runner() {
// member variable
queue = Queue.Synchronized(new Queue());
while (true) {
if (0 < queue.Count) {
queue.Dequeue();
}
}
}
这是在单个线程中运行的:
var t = new Thread(Runner);
t.IsBackground = true;
t.Start();
其他事件已在别处“排队”。我所见过的情况是,随着时间的推移,“出队”将抛出InvalidOperationException异常,队列为空。这应该是不可能的,因为计数保证了队列中有东西,而且我确定没有其他地方正在“出队”。
问题如下:
1. 可能吗,入队操作会在项目完全进入队列之前增加计数(无论这是什么意思)? 2. 可能吗,线程在Dequeue语句处重新开始(过期、重置...),但在此之后它已经立即移除了一个项目?
编辑(澄清):
这些代码片段是包装器类的一部分,实现后台辅助线程。这里的Dequeue是唯一的Dequeue,并且所有的Enqueue/Dequeue都在同步的成员变量(queue)上进行。