Я не эксперт по безопасности потоков, но я пытаюсь узнать как можно больше об этом.
Раньше я думал (как и вы), что эта операция может быть безопасна для потоков, так как просто записывает данные в очереди в разных потоках, и никакая очередь не выполняется. Но, как кто-то объяснил здесь (и везде в документации MSDN):
Публичная статика (общая в Visual Basic)
члены этого типа безопасны для
многопоточные операции. Пример
участникам не гарантируется быть
потокобезопасный.
Это означает, что, возможно, внутренне MyQueue.Enqueue(Obj)
делается так:
- Поместить данные в очередь ();
- Указатель очереди дополнения;
Если это будет сделано таким образом, у вас возникнут проблемы с многопоточностью, потому что, как вы можете видеть, вы можете перезаписать одну и ту же позицию в очереди двумя потоками, потому что один пишет после того, как другой сделал то же самое, но не смог увеличить указатель уже.
Имея это в виду, у вас есть несколько вариантов, как указано здесь, блокировка метода Enqueue (), использование Queue.Synchronized () или, может быть, даже проще, но с большим влиянием на производительность, блокировка частного свойства при доступе к объекту Queue таким образом (потому что все, что вы делаете с очередью, не будет потокобезопасным):
Private ReadOnly Property MyQueue() as Queue
Get
SyncLock (m_myQueueLock)
Return m_myQueue
EndSyncLock
End Get
End Property
Надеюсь, это поможет!