2010-07-14 3 views
2

Ceci est ma tentative de créer un ObservableCollection dans VB qui est thread-safe WPF. Pouvez-vous penser à des problèmes qu'il pourrait avoir?ObservableCollection multi-thread dans VB

Public Class WpfObservableCollection(Of T) 
    Inherits ObjectModel.ObservableCollection(Of T) 

    Public Sub New() 

    End Sub 

    Public Sub New(ByVal list As List(Of T)) 
     MyBase.New(list) 

    End Sub 

    Public Sub New(ByVal collection As IEnumerable(Of T)) 
     MyBase.New(collection) 

    End Sub 

    Protected Overrides Sub OnCollectionChanged(ByVal e As System.Collections.Specialized.NotifyCollectionChangedEventArgs) 

     Dim eventList = CType(CollectionChangedField.GetValue(Me), NotifyCollectionChangedEventHandler) 

     If eventList IsNot Nothing Then 

      Using Me.BlockReentrancy 

       Dim activeDispatcher = (From nh In eventList.GetInvocationList() Let dpo = TryCast(nh.Target, DispatcherObject) Where dpo IsNot Nothing Select dpo.Dispatcher).FirstOrDefault() 

       If activeDispatcher IsNot Nothing AndAlso Not activeDispatcher.CheckAccess Then 
        activeDispatcher.BeginInvoke(Sub() MyBase.OnCollectionChanged(e), DispatcherPriority.DataBind) 
       Else 
        MyBase.OnCollectionChanged(e) 
       End If 

      End Using 

     End If 

    End Sub 

    Private Shared ReadOnly CollectionChangedField As FieldInfo = GetType(ObjectModel.ObservableCollection(Of T)).GetField("CollectionChanged", BindingFlags.NonPublic Or BindingFlags.Instance) 

End Class 

(.. Par thread-safe Je veux dire sûr pour une utilisation avec une interface graphique WPF Threads De toute évidence, il ne peut toujours pas gérer les mises à jour simultanées)

+0

Je suis curieux de savoir pourquoi vous avez fourni un Nouveau (Liste (Of T)) lorsque vous avez déjà eu un Nouveau (IEnumerable (Of T)). N'importe quelle raison? –

Répondre

0

au lieu d'hériter de la collection observable, une liste concurrente wrap existante et mettre en œuvre vous INotifyCollectionChanged.