Если вы используете это из нескольких потоков, вам нужно будет ввести некоторую форму блокировки, чтобы избежать проблем с синхронизацией вашей очереди. Вы, вероятно, также должны убедиться, что ваша очередь заблокирована при постановке в очередь элементов, а также исключение из очереди элементов.
Если поток, обрабатывающий вашу очередь, не будет ничего делать, кроме этого, ваш базовый код, вероятно, в порядке, за исключением обработки случая, когда очередь в настоящее время пуста. Вы, вероятно, должны добавить что-то вроде:
while (myQueue.Count == 0)
Thread.Sleep(sleepTime);
Это даст вам возможность "ждать", пока ваши события не заполнят вашу очередь.
Кроме того, когда вы выходите из очереди, вы не сможете использовать foreach. Вы хотите сделать что-то вроде:
while (myQueue.Count == 0)
Thread.Sleep(sleepTime);
while (myQueue.Count > 0)
{
lock(myLock)
myObject = myQueue.Dequeue();
// do your work...
}
Это предотвратит проблемы с изменением коллекции, если кто-то добавит в вашу очередь, и избавит вас от необходимости блокировать все время обработки ваших элементов.
Редактировать: Я согласен с некоторыми комментариями, что это не всегда самая эффективная стратегия.
Если очередь будет в значительной степени пустой и в некоторых случаях будет иметь элементы, я создам собственный класс, который обернет ее.
Вы можете вызвать событие, когда очередь станет пустой / непустой. Как только очередь получает элементы, событие может инициировать поток для его обработки и очистки. Как только он достигнет 0 элементов, он может иметь событие, чтобы остановить обработку.
Это было бы намного эффективнее, чем постоянное ожидание, если в большинстве случаев состояние очереди пустое. С другой стороны, если очередь заполнена почти постоянно, а поток обработки будет редко поддерживаться, для простоты я использовал бы описанный выше подход.