Речь идет не о различных методах, которые я мог использовать или использовать, чтобы использовать очереди наилучшим образом, скорее то, что я видел, что не имеет смысла для меня.C# Threading and Queues
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, очередь пуста. Это должно быть невозможно увидеть, как подсчет гарантирует, что там что-то есть, и я уверен, что больше ничего не происходит «Dequeue» ing.
вопрос (ы):
- Возможно ли, что Enqueue фактически увеличивает количество до того, как элемент полностью на очереди (независимо от того, что значит ...)?
- Возможно ли, что нить каким-то образом перезапустится (истекает, переиздается ...) в операторе Dequeue, но сразу же после того, как он уже удалил элемент?
Edit (осветление):
Эти кодовые части являются частью класса Wrapper, который реализует фон вспомогательный поток. Dequeue здесь является единственным Dequeue, и все Enqueue/Dequeue находятся в переменной Synchronized (queue).
Из-за ответа Райана ... это настоящий код или просто упрощенный пример? Если это реальный код, вы должны действительно думать об изменении цикла - опрос очереди вместо синхронизации чтения с писателями - плохой дизайн. Вы тратите миллионы процессорных циклов, чтобы нагреть комнату. –
Это пример, чтобы добраться до мяса проблемы. Там есть Thread.Sleep, процессор не забивается. Причина, по которой я выбрал процесс опроса вместо чтения/чтения с синхронизацией, объясняется тем, что в очереди есть что-то в ней почти все время. В нашем багажнике, хотя я добавил AutoResetEvent, чтобы поиграть. Как я уже сказал наверху, я не очень беспокоюсь о реализации здесь. Кажется, что существует настоящая проблема с этой моделью потоков, будь то правильно или неправильно. – neouser99
От взгляда на ваш код у вас есть, по крайней мере, основной поток и поток, в котором вы думаете, что вызывается Dequeue. Почему бы не назвать ваши потоки, и каждый раз, когда вызывается Dequeue, регистрируйте имя потока с трассировкой стека. Вы могли бы обнаружить, что что-то в основном потоке ведет себя так, как вы этого не ожидали. –