SqlParameterCollection.SyncRoot Свойство
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Получает объект, который можно использовать для синхронизации доступа к объекту SqlParameterCollection.
public:
virtual property System::Object ^ SyncRoot { System::Object ^ get(); };
public override object SyncRoot { get; }
member this.SyncRoot : obj
Public Overrides ReadOnly Property SyncRoot As Object
Значение свойства
Объект, который можно использовать для синхронизации доступа к объекту SqlParameterCollection.
Примеры
В следующем примере кода показано, как заблокировать коллекцию с помощью SyncRoot свойства во время всего перечисления.
ICollection^ myCollection = someCollection;
bool lockTaken = false;
try
{
Monitor::Enter(myCollection->SyncRoot, lockTaken);
for each (Object^ item in myCollection);
{
// Insert your code here.
}
}
finally
{
if (lockTaken)
{
Monitor::Exit(myCollection->SyncRoot);
}
}
ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
foreach (object item in myCollection)
{
// Insert your code here.
}
}
Dim myCollection As ICollection = someCollection
SyncLock myCollection.SyncRoot
For Each item In myCollection
' Insert your code here.
Next item
End SyncLock
Комментарии
Этот член является явной реализацией элемента интерфейса. Его можно использовать только в том случае, если SqlParameterCollection экземпляр приведение к интерфейсу ICollection .
Для коллекций, базовые хранилища которых недоступны для общедоступного доступа, ожидается, что реализация возвращает текущий экземпляр. Обратите внимание, что указатель на текущий экземпляр может быть недостаточно для коллекций, которые упаковывают другие коллекции; они должны возвращать свойство базовой коллекции SyncRoot .
Большинство классов коллекций System.Collections в пространстве имен также реализуют Synchronized метод, который предоставляет синхронизированную оболочку вокруг базовой коллекции. Однако производные классы могут предоставлять собственную синхронизированную версию коллекции с помощью SyncRoot свойства. Синхронизированный код должен выполнять операции со свойством SyncRoot коллекции, а не непосредственно в коллекции. Это обеспечивает правильную работу коллекций, производных от других объектов. В частности, он поддерживает правильную синхронизацию с другими потоками, которые могут одновременно изменять экземпляр коллекции.
При отсутствии Synchronized метода в коллекции ожидаемое использование SyncRoot выглядит следующим образом:
ICollection^ myCollection = someCollection;
bool lockTaken = false;
try
{
Monitor::Enter(myCollection->SyncRoot, lockTaken);
// Some operation on the collection, which is now thread safe.
}
finally
{
if (lockTaken)
{
Monitor::Exit(myCollection->SyncRoot);
}
}
ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
// Some operation on the collection, which is now thread safe.
}
Dim myCollection As ICollection = someCollection
SyncLock myCollection.SyncRoot
' Some operation on the collection, which is now thread safe.
End SyncLock
Перечисление через коллекцию по сути не является потокобезопасной процедурой. Даже если коллекция синхронизирована, другие потоки по-прежнему могут изменять коллекцию, что приводит к возникновению исключения перечислителем. Чтобы гарантировать безопасность потоков во время перечисления, можно заблокировать коллекцию во время всего перечисления или поймать исключения, полученные из изменений, внесенных другими потоками.