Это моя попытка создать коллекцию ObservableCollection в VB, ориентированную на многопоточность WPF.Можете ли вы вспомнить какие-либо проблемы, с которыми он может столкнуться?
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. Очевидно, он по-прежнему не может обрабатывать параллельные обновления.)