WPF, Silverlight, Silverlight for Windows Phone und Metro-Style-Apps

WPF 4.5 Cross-Thread Collection Synchronization
Kommentare

In der neuen Kolumne „XAML Expertise“ des Windows Developer Magazins präsentiert Gregor Biswanger Top-How-tos zum Thema XAML. Einsteiger und fortgeschrittene XAML-Experten sollen hier durch geballtes Wissen gesättigt werden. Heute gibt die Expertise: „WPF 4.5: Cross-Thread Collection Synchronization“. Viel Spaß mit „XAML Expertise“!

Windows Developer

Dieser Teil aus der Kolumne „XAML Expertise“ von Gregor Biswanger ist erstmalig erschienen im Windows Developer 8.2012

Oft wird aus WPF eine Logik asynchron in einem neuen Thread ausgeführt. Die zurückgelieferten Daten sollen dann in eine hinzugefügt werden. Dann folgt bereits eine NotSupportedException, da die Daten aus einem anderen Thread kommen als die vorhandene ObservableCollection -Instanz. Sie befindet sich auf dem UI Thread (Listing 2). Die gängige Lösung zu diesem Problem wäre, den asynchronen Code mittels Dispatcher zu starten. Das wäre bei einem einzelnen Aufruf noch akzeptabel, aus verschiedenen Methoden heraus nimmt der Dispatcher jedoch die klare Sicht auf die funktionalen Anforderungen.

Ab WPF 4.5 können Collections direkt nach ihrer Instanziierung, Thread-Safe und UI-Thread-unabhängig verwendet werden. Dabei hilft die neue statische BindingOperations.EnableCollectionSynchronization -Methode. Sie wird direkt nach dem Instanziieren der ObservableCollection aufgerufen. Die Methode erwartet zwei Parameter. Beim ersten Parameter wird eine IEnumberable Collection überreicht. Die zweite Methode benötigt dann ein Object, das dann parallel ausgeführten Code Thread-Safe behandeln lässt. Dazu wird ein Private Field vom Typ Object erzeugt und überreicht. Die Funktion, die direkten Einfluss auf die ObservableCollection ausübt, kann dann direkt mittels lock den Vorgang Thread-Safe ausführen. Listing 2 veranschaulicht die neue Funktion im Einsatz.

Listing 1: Die ObservableCollection wird aus einem neuen Thread angesprochen und löst eine NotSupportedException aus

public class ViewModel
{
  public ObservableCollection Customers { get; set;}
  
  public ViewModel()
  {
    Customers = new ObservableCollection();
  }
  
  public void LoadCustomers(object sender, RoutedEventArgs e)
  {
    Task.Factory.StartNew(() =>
    {
      Customer customerA = new Customer { Name = "Gregor" };
      Customer customerB = new Customer { Name = "Christine" };
      Customer customerC = new Customer { Name = "Robert" };
      Customer customerD = new Customer { Name = "Max" };
      
      // Here throws NotSupportedException!
      Customers.Clear();
      
      Customers.Add(customerA);
      Customers.Add(customerB);
      Customers.Add(customerC);
      Customers.Add(customerD);
    }
  }
}  
Listing 2: Die neue BindingOperations.EnableCollectionSynchronization-Methode im Einsatz unter WPF 4.5

public class ViewModel
{
  public ObservableCollection Customers { get; set;}
  private object _listLock = new object();
  
  public ViewModel()
  {
    Customers = new ObservableCollection();
    BindingOperations.EnableCollectionSynchronization(Customers, _listLock);
  }
  
  public void LoadCustomers(object sender, RoutedEventArgs e)
  {
    Task.Factory.StartNew(() =>
    {
      Customer customerA = new Customer { Name = "Gregor" };
      Customer customerB = new Customer { Name = "Christine" };
      Customer customerC = new Customer { Name = "Robert" };
      Customer customerD = new Customer { Name = "Max" };
      
      lock(_listLock)
      {
        Customers.Clear();
        
        Customers.Add(customerA);
        Customers.Add(customerB);
        Customers.Add(customerC);
        Customers.Add(customerD);
      }
    }
  }
}  

Gregor Biswanger ist Microsoft MVP für Client App Dev und arbeitet als Solution Architect und XAML-Experte in der Firma impuls Informationsmanagement GmbH in Nürnberg. Seine Schwerpunkte sind die .NET-Architektur, Silverlight und agile Prozesse. Er veröffentlichte vor Kurzem seine DVD mit Videotrainings zum Thema „WPF 4 und Silverlight 4“ bei Addison-Wesley von video2brain. Biswanger ist auch freier Autor, Speaker und Microsoft CLIPler der INdotNET (Ingolstädter .NET Developers Group). Sie erreichen seinen Blog unter www.dotnet-blog.net.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -