2010-07-14 6 views
2

이것은 스레드 안전 WPF 인 ObservableCollection을 VB에서 만들려고 시도한 것입니다. 문제가 있다고 생각합니까? http://www.codeproject.com/KB/collections/AsyncObservableCollection.aspx 그것은 VB에없는 :VB에서 다중 스레드 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 스레드와 함께 사용하기위한 안전 뜻으로)

+0

새 항목 (IEnumerable (Of T))이 이미있을 때 New (List Of Of T)를 제공 한 이유가 궁금합니다. 어떤 이유? –

답변

2

아마 당신은 볼 수 있었다 , 그것은 C#에서하지만 당신은 아마 몇 가지 아이디어를 찾을 수 있습니다. 또한 "SyncRoot"속성에서 잠금 객체를 사용해야합니다.

행운을 빌어 요,

에릭

대신 관찰 컬렉션 상속의
+0

VB.NET은 모든 .NET 코드를 호출 할 수 있습니다. –

0

는 기존 동시 목록을 포장하고 자신을 INotifyCollectionChanged 구현합니다.