バージョン

ThreadSynchronizationCollection プロパティ

AllValues 列挙体を使用する場合、スレッド アクセスを同期化するために使用するコレクションを返します。
シンタックス
'宣言
 
Public Overridable ReadOnly Property ThreadSynchronizationCollection As IEnumerable
public virtual IEnumerable ThreadSynchronizationCollection {get;}
解説

.NET Framework 4.5 で Microsoft がクロス スレッドの更新のサポートおよび BindingOperations の EnableCollectionSynchronization および AccessCollection メソッドによってアクセスするサポートを追加しました。このシナリオで、AllValues プロパティを安全に繰り返すために ThreadSynchronizationCollection プロパティを使用できます。例:

             
              BindingOperations.AccessCollection(context.ThreadSynchronizationCollection, new Action(() =>
                  {
                      foreach (ValueEntry ii in context.AllValues)
                      {
                          /// ... process the entry
                      }
                  }), false);
                  
             

注: その AccessCollection メソッドを呼び出す各スレッドは .NET Framework 4.5 で追加された BindingOperations.EnableCollectionSynchronization を呼び出す必要があります。特定のコレクションで各スレッドに同じロック オブジェクトと呼び出す必要があります。例:

             
               var list = new ObservableCollection<MyClass>();
            
               var lockingObj = new object();
               
               // Call EnableCollectionSynchronization on the UI thread
               BindingOperations.EnableCollectionSynchronization(list, lockingObj);
               
               // Note: that XamDataGrid will only support cross-thread updating if the list is in a CollectionView
               XamDataGrid1.DataSource = CollectionViewSource.GetDefaultView(list);
               
               // perform updating of the collection on a background thread using locks
               Task.Run(new Action(() =>
               {
                   // lock using the same locking object that was passed into EnableCollectionSynchronization
                   // above on the UI thread
                   lock(lockingObj)
                   {
                       list.Add(new MyClass());
                   }
               }));
               
               // Alternatively, you can perform updating of the collection on a background thread using AccessCollection, e.g.:
               Task.Run(new Action(() =>
               {
                   // Since we will be calling AccessCollection on this thread we need to first call
                   // EnableCollectionSynchronization with the same locking object
                   BindingOperations.EnableCollectionSynchronization(list, lockingObj);
            
                   // calling AccessCollection will wrap the action in a synchronization lock
                   BindingOperations.AccessCollection(list, new Action(() =>
                   {
                       list.Add(new MyClass());
                   }), true);
               }));
             

参照