Wpf VB中的多线程可观测采集

Wpf VB中的多线程可观测采集,wpf,vb.net,multithreading,Wpf,Vb.net,Multithreading,这是我试图在VB中创建一个WPF线程安全的ObservableCollection。你能想到它可能有什么问题吗 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

这是我试图在VB中创建一个WPF线程安全的ObservableCollection。你能想到它可能有什么问题吗

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

(所谓线程安全,我指的是与WPF GUI线程一起使用的安全。显然,它仍然无法处理并发更新。)

也许您可以看看: 它不是用VB编写的,而是用C#编写的,但你可能会找到一些想法。您还应该使用属性“SyncRoot”中的锁定对象

祝你好运


Eric

不是从可观察集合继承,而是包装一个现有的并发列表,并自己实现INotifyCollectionChanged。

我很好奇,当您已经有了一个新的(IEnumerable(of T))时,为什么还要提供一个新的(list(of T))。有什么原因吗?