WPF, Silverlight, Windows Phone 8 und Windows-Store-App

Universal-Apps: Dispatcher vom aktuellen UI-Thread ermitteln
Kommentare

In der Kolumne „XAML Expertise“ 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 es folgende Expertise: „Universal-Apps: Dispatcher vom aktuellen UI-Thread ermitteln“.

XAML-Anwendungen beginnen mit zwei Threads, einem für das Rendering und einem für die Verwaltung der Benutzeroberfläche. Der Renderingthread ist ein verborgener, im Hintergrund ausgeführter Thread. Daher ist der UI-Thread derjenige, mit dem Sie sich normalerweise befassen. Die meisten Objekte in XAML müssen mit dem UI-Thread verbunden sein.

Multi-Threading-Problem beheben

Das bedeutet, dass ein XAML-Objekt nur in dem Thread verwendet werden kann, in dem es erstellt wurde. Eine Verwendung in anderen Threads führt zu einer Exception. Genau das passiert häufig beim Verarbeiten von asynchronem Code. Dieses Multi-Threading-Problem wird von der Dispatcher-Klasse behandelt, so wie es in Listing 1 veranschaulicht wird. Diese synchronisiert den Prozess zum jeweiligen UI-Thread.

 Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
  {
    // ...
});

Ein Problem besteht bei der Verwendung vom MVVM-Pattern. Denn eine gültige Dispatcher-Instanz wird nur von der Code-Behind zur Verfügung gestellt. In den meisten Fällen wird diese dagegen beim ViewModel benötigt oder auch an anderen Stellen außerhalb des UI-Threads. Die Lösung dazu bietet die CoreWindow.GetForCurrentThread-Methode. Diese ermittelt den aktuellen UI-Thread und stellt eine gültige Dispatcher-Instanz zur Verfügung. Wie man diese verwendet, zeigt Listing 2.

CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
  {
    // ...
});
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -