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