Hashtable.SyncRoot 属性


获取可用于同步对 Hashtable 的访问的对象。Gets an object that can be used to synchronize access to the Hashtable.

 virtual property System::Object ^ SyncRoot { System::Object ^ get(); };
public virtual object SyncRoot { get; }
member this.SyncRoot : obj
Public Overridable ReadOnly Property SyncRoot As Object


可用于同步对 Hashtable 的访问的对象。An object that can be used to synchronize access to the Hashtable.



若要创建 @no__t 的同步版本-0,请使用 Synchronized 方法。To create a synchronized version of the Hashtable, use the Synchronized method. 但是,派生类可以使用 SyncRoot 属性提供自己的 @no__t 的同步版本。However, derived classes can provide their own synchronized version of the Hashtable using the SyncRoot property. 同步代码必须对 @no__t 的 @no__t 0 执行操作,而不是直接在 Hashtable 上执行操作。The synchronizing code must perform operations on the SyncRoot of the Hashtable, not directly on the Hashtable . 这样可确保对从其他对象派生的集合正确地执行操作。This ensures proper operation of collections that are derived from other objects. 具体而言,它与其他可能同时修改 @no__t 0 对象的线程保持正确的同步。Specifically, it maintains proper synchronization with other threads that might be simultaneously modifying the Hashtable object.

枚举集合本质上不是线程安全的过程。Enumerating through a collection is intrinsically not a thread safe procedure. 即使某个集合已同步,其他线程仍可以修改该集合,这会导致枚举数引发异常。Even when a collection is synchronized, other threads can still modify the collection, which causes the enumerator to throw an exception. 若要确保枚举过程中的线程安全性,可以在整个枚举期间锁定集合,或者捕获由其他线程进行的更改所导致的异常。To guarantee thread safety during enumeration, you can either lock the collection during the entire enumeration or catch the exceptions resulting from changes made by other threads.

下面的代码示例演示如何在整个枚举过程中使用 SyncRoot 锁定集合:The following code example shows how to lock the collection using the SyncRoot during the entire enumeration:

Hashtable^ myCollection = gcnew Hashtable();
bool lockTaken = false;

    Monitor::Enter(myCollection->SyncRoot, lockTaken);
    for each (Object^ item in myCollection)
        // Insert your code here.
    if (lockTaken)
var myCollection = new Hashtable();
lock (myCollection.SyncRoot)
    foreach (object item in myCollection)
        // Insert your code here.
Dim myCollection As New Hashtable()
SyncLock myCollection.SyncRoot
    For Each item In myCollection
        ' Insert your code here.
End SyncLock