Речь идет не о различных методах, которые я мог или должен использовать, чтобы использовать очереди наилучшим образом, скорее то, что я видел, что не имеет смысла для меня.
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();
Другими событиями являются "Enqueue" else. То, что я видел, происходит в течение определенного периода времени, Dequeue на самом деле бросает InvalidOperationException, очередь пуста. Это должно быть невозможно увидеть, как подсчет гарантирует, что там что-то есть, и я уверен, что ничто иное не "Dequeue" ing.
Вопрос (ы):
- Возможно ли, что Enqueue фактически увеличивает счет до того, как элемент полностью находится в очереди (что бы это ни значило...)?
- Возможно ли, что поток каким-то образом перезапустит (истекает, реселлирует...) в операторе Dequeue, но сразу же после того, как он уже удалил элемент?
Изменить (пояснение):
Эти фрагменты кода являются частью класса Wrapper, который реализует фоновый вспомогательный поток. Dequeue здесь является единственным Dequeue, и все Enqueue/Dequeue находятся в синхронной переменной-члене (очереди).