Не универсальные коллекции .NET (пространство имен System.Collections) могут это делать. Я добавил следующий фрагмент со страницы MSDN Queue.SyncRoot :
Queue myCollection = new Queue();
lock(myCollection.SyncRoot)
{
foreach (Object item in myCollection)
{
// Insert your code here.
}
}
Или вы можете сразу создать синхронизированную оболочку:
Queue mySyncCollection = Queue.Synchronized(myCollection);
// No locks required
К сожалению, это невозможно сделать с универсальными коллекциями, поэтому, возможно, вам придется написать свои собственные методы оболочки / расширения, если вы хотите использовать универсальные коллекции.