Wie werden, um thread-sichere Verwendung von INotifyPropertyChanged mit keine SynchronizationContext?

Wie halten Sie Ihre Objekte thread-sicher, dass die INotifyPropertyChanged implementieren? Ich kann nicht mit einem SynchronizationContext, weil ich muss in der Lage sein zu serialisieren des Objekts.

    protected void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
           //What can I add here to make it thread-safe? 
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
  • "Ich kann nicht mit einem SynchronizationContext, weil ich muss in der Lage sein zu serialisieren des Objekts." -- das sollte nicht das problem sein. Haben Sie markiert den Bereich mit [NonSerialized] und fügte hinzu, eine OnDeserializing Methode, um es zurückzusetzen, wenn Sie zu Deserialisieren?
  • Habe ich nicht. Gibt es eine "einfachere" Weg, als dass Sie gehen, um in meinem code, Versand in die SynchronizationContext-wenn das Objekt erstellt wird? Oder bin ich einfach nur zu faul 😀
  • Wenn Sie das Objekt im gleichen Kontext, in dem Sie wünschen, dass der event-Handler ausgeführt werden, können Sie das Feld SynchronizationContext.Current im Objekt-Konstruktor, aber sonst, ich bin mir nicht sicher, was der beste Weg zu gehen sein.
  • Im Allgemeinen würde ich erwarten, dass die Veranstaltung raiser nur die Garantie bieten, dass der thread, auf dem die Eigenschaft geändert wird, ist die eine, die PropertyChanged - Ereignis ausgelöst wird, auf (das ist, was dein Beispiel zeigt). Daher würde ich erwarten, dass der handler (vermutlich dein UI oder UI-binding, oder ein UI binding source) zu befassen sich mit der Synchronisation, wenn es wirklich nötig ist. Alternativ, wirklich vorsichtig sein, nur änderungen aus den richtigen thread.
InformationsquelleAutor Stephen | 2012-04-12
Schreibe einen Kommentar