Нет, не в порядке.Прежде всего, если вы измените ссылку таким образом в параллельном потоке, _packetQueue должен быть помечен как энергозависимый, чтобы оптимизации компилятора и кода не могли увидеть изменения.Вызвание _packetQueue shoudl обычно происходит как Interlocked.CompareExchange, но это менее критично для вашего использования.
Но для большего беспокойства есть шаблон изменения экземпляра packetQueue, подобный этому в фоновом потоке.Какова цель этого?У него ужасный запах кода ...
обновлено
Что я обычно делаю, это:
Поток (ы) производителя:
Producer () {
...
lock(_sharedQueue) {
_sharedQueue.Enqueue(something);
}
...
}
потребительский поток:
consumer (...) {
...
var Something[] toProcess = null;
lock(_sharedQueue)
{
toProcess = _sharedQueue.Toarray();
_sharedQueue.Clear();
}
// Process here the toProcess array
...
}
Этого было достаточно для каждого отдельного использования, которое я когда-либо имел.Обработка не происходит под блокировкой, поэтому блокировка минимальна.Не нужно модного ConcurrentQueue, достаточно простой старой коллекции .Net 2.0.Обычно для хорошей практики я использую выделенный объект блокировки вместо того, чтобы блокировать фактический экземпляр очереди.