DependencyObject.Dispatcher Eigenschaft
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ruft den CoreDispatcher ab, dem dieses Objekt zugeordnet ist. CoreDispatcher stellt eine Funktion dar, die auf das DependencyObject im UI-Thread zugreifen kann, auch wenn der Code von einem Nicht-UI-Thread initiiert wird.
public:
property CoreDispatcher ^ Dispatcher { CoreDispatcher ^ get(); };
CoreDispatcher Dispatcher();
public CoreDispatcher Dispatcher { get; }
var coreDispatcher = dependencyObject.dispatcher;
Public ReadOnly Property Dispatcher As CoreDispatcher
Eigenschaftswert
Der CoreDispatcher , dem das DependencyObject-Objekt zugeordnet ist, der den UI-Thread darstellt.
Beispiele
In diesem Beispiel wird eine Verwendung von Dispatcher für die implizite Verwendung einer CodeBehind-Datei für eine Seite veranschaulicht. In diesem Beispiel wird ein Lambdaausdruck verwendet, um die DispatchedHandler-Implementierung hinzuzufügen. Der Handler selbst behandelt das Accelerometer.ReadingChanged-Ereignis , das nicht im UI-Thread ausgeführt wird.
private async void ReadingChanged(object sender, AccelerometerReadingChangedEventArgs e)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
AccelerometerReading reading = e.Reading;
ScenarioOutput_X.Text = String.Format("{0,5:0.00}", reading.AccelerationX);
ScenarioOutput_Y.Text = String.Format("{0,5:0.00}", reading.AccelerationY);
ScenarioOutput_Z.Text = String.Format("{0,5:0.00}", reading.AccelerationZ);
});
}
Hinweise
Die Dispatcher-Eigenschaft stellt den CoreDispatcher-Verweis bereit, der verwendet werden kann, um Aufrufe von Nicht-UI-Threads mithilfe von RunAsync und einer erwarteten Funktion zu marshallen. Weitere Informationen zu erwarteten Funktionen finden Sie unter Aufrufen asynchroner APIs in C# oder Visual Basic. Weitere Informationen finden Sie im Abschnitt "DependencyObject und Threading" des Referenzthemas DependencyObject .
Ein DependencyObject muss in einem UI-Thread erstellt werden und hat Affinität zum UI-Thread. Da es sich um einen Einstiegspunkt handelt, der das Durchlaufen von Threads ermöglicht, ist DependencyObject.Dispatcher die einzige instance API von DependencyObject oder einer seiner Unterklassen, auf die von einem Nicht-UI-Thread aus zugegriffen werden kann, ohne dass eine Threadübergreifende Ausnahme ausgelöst wird. Alle anderen DependencyObject-APIs lösen eine Ausnahme aus, wenn Sie versuchen, sie über einen Workerthread oder einen anderen Nicht-UI-Thread aufzurufen.
Insbesondere ruft die Dispatcher-Eigenschaft den CoreDispatcher ab, der dem App-UI-Thread zugeordnet ist. Das Ausführen von Code über die RunAsync-Methode des CoreDispatcher ist erforderlich, wenn Sie den Wert einer Abhängigkeitseigenschaft abfragen oder ändern möchten, auch wenn dieses Objekt noch nicht der visuellen XAML-Struktur oder der sichtbaren Benutzeroberfläche (dem visuellen Stamm des App-Fensters) zugeordnet ist.
Window.Dispatcher verweist auch auf einen CoreDispatcher , der dem UI-Thread zugeordnet ist. Window.Dispatcher ist im Grunde nur ein Wrapper um CoreWindow.Dispatcher , sodass eine Window-Klasse einfachen Zugriff darauf hat.
Hinweis
Die Verbindung für einen Dispatcher-Wert ist in einer Entwurfszeitansicht nicht verfügbar. Dies kann Probleme verursachen, wenn Sie ein benutzerdefiniertes Steuerelement erstellt haben, das Dispatcher-Werte verwendet, und auf diesen Code von einer Entwurfszeitumgebung über Codepfade zugegriffen wird, die eine Entwurfsansicht verwendet, z. B. Konstruktoren und geladene Handler. Wenn Sie ein benutzerdefiniertes Steuerelement schreiben und dieses Problem auftritt, sollten Sie eine bedingte Schutzvorrichtung in Ihren Code einführen, z. B. den Code nicht aufrufen, wenn DesignModeEnabledtrue ist.