Многопоточная ObservableCollection в VB - PullRequest
2 голосов
/ 15 июля 2010

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

Ответы [ 2 ]

2 голосов
/ 29 апреля 2011

Возможно, вы могли бы взглянуть на: http://www.codeproject.com/KB/collections/AsyncObservableCollection.aspx Это не в VB, это в C #, но вы, вероятно, могли бы найти некоторые идеи.Вам также следует использовать объект блокировки из свойства "SyncRoot".

Удачи,

Эрик

0 голосов
/ 30 апреля 2011

Вместо того чтобы наследовать от наблюдаемой коллекции, оберните существующий параллельный список и внедрите INotifyCollectionChanged самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...