Xamarin.Essentials: MainThread

Mit der MainThread-Klasse können Anwendungen Code im Hauptausführungsthread ausführen und bestimmen, ob ein bestimmter Codeblock aktuell im Hauptthread ausgeführt wird.

Hintergrund

Die meisten Betriebssysteme – einschließlich iOS, Android und der universellen Windows-Plattform (UWP) – verwenden ein Single-Threading-Modell für Code, der die Benutzeroberfläche betrifft. Dieses Modell ist notwendig, um Ereignisse der Benutzeroberfläche, einschließlich Tastaturanschläge und Toucheingabe, ordnungsgemäß zu serialisieren. Dieser Thread wird oft als Hauptthread, Benutzeroberflächenthread oder UI-Thread bezeichnet. Der Nachteil dieses Modells ist, dass Code, der auf Elemente der Benutzeroberfläche zugreift, im Hauptthread der Anwendung ausgeführt werden muss.

Anwendungen müssen manchmal Ereignisse verwenden, die den Ereignishandler in einem sekundären Ausführungsthread aufrufen. (Die Xamarin.Essentials-Klassen Accelerometer, Compass, Gyroscope, Magnetometer und OrientationSensor geben bei Verwendung mit höheren Geschwindigkeiten Informationen ggf. über einen Sekundärthread zurück.) Wenn der Ereignishandler auf Elemente der Benutzeroberfläche zugreifen muss, muss er diesen Code im Hauptthread ausführen. Mit der MainThread-Klasse können Anwendungen diesen Code im Hauptthread ausführen.

Erste Schritte

Lesen Sie zum Einstieg in die Verwendung dieser API den Leitfaden mit ersten Schritte für Xamarin.Essentials, um sicherzustellen, dass die Bibliothek ordnungsgemäß installiert und in Ihren Projekten eingerichtet ist.

Ausführen von Code im Hauptthread

Fügen Sie in Ihrer Klasse einen Verweis auf Xamarin.Essentials hinzu:

using Xamarin.Essentials;

Um Code im Hauptthread auszuführen, rufen Sie die statische MainThread.BeginInvokeOnMainThread-Methode auf. Das Argument ist ein Action-Objekt, das einfach eine Methode ohne Argumente und ohne Rückgabewert ist:

MainThread.BeginInvokeOnMainThread(() =>
{
    // Code to run on the main thread
});

Es ist auch möglich, eine separate Methode für den Code zu definieren, der im Hauptthread ausgeführt werden muss:

void MyMainThreadCode()
{
    // Code to run on the main thread
}

Sie können diese Methode dann im Hauptthread ausführen, indem Sie sie in der BeginInvokeOnMainThread-Methode referenzieren:

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Hinweis

Xamarin.Forms verfügt über eine Methode mit dem Namen ,Device.BeginInvokeOnMainThread(Action), die dieselbe Aufgabe ausführt wie MainThread.BeginInvokeOnMainThread(Action). Sie können beide Methoden in einer Xamarin.Forms-App verwenden. Berücksichtigen Sie hierbei aber, ob der aufrufende Code noch andere Abhängigkeiten von Xamarin.Forms benötigt. Wenn das nicht der Fall ist, ist MainThread.BeginInvokeOnMainThread(Action) besser geeignet.

Festlegen, ob Code im Hauptthread ausgeführt wird

Mit der MainThread-Klasse kann eine Anwendung außerdem bestimmen, ob ein bestimmter Codeblock im Hauptthread ausgeführt wird. Die IsMainThread-Eigenschaft gibt true zurück, wenn der Code, der die Eigenschaft aufruft, im Hauptthread ausgeführt wird. Ein Programm kann diese Eigenschaft verwenden, um anderen Code für den Hauptthread oder einen Sekundärthread auszuführen:

if (MainThread.IsMainThread)
{
    // Code to run if this is the main thread
}
else
{
    // Code to run if this is a secondary thread
}

Vielleicht möchten Sie überprüfen, ob Code auf einem sekundären Thread ausgeführt wird, bevor Sie BeginInvokeOnMainThread aufrufen:

if (MainThread.IsMainThread)
{
    MyMainThreadCode();
}
else
{
    MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
}

Möglicherweise vermuten Sie, dass diese Überprüfung die Leistung verbessert, wenn der Codeblock bereits auf dem Hauptthread läuft.

Diese Überprüfung ist jedoch nicht erforderlich. Die Plattformimplementierungen von BeginInvokeOnMainThread überprüfen selbst, ob der Aufruf im Hauptthread erfolgt. Es gibt nur sehr geringe Leistungseinbußen, wenn Sie BeginInvokeOnMainThread aufrufen, ohne dass es wirklich notwendig ist.

Weitere Methoden

Die MainThread-Klasse umfasst die folgenden zusätzlichen static-Methoden, die für die Interaktion mit Elementen der Benutzeroberfläche aus Hintergrundthreads verwendet werden können:

Methode Argumente Rückgabe Zweck
InvokeOnMainThreadAsync<T> Func<T> Task<T> Ruft Func<T> auf dem Hauptthread auf, und wartet auf den Abschluss
InvokeOnMainThreadAsync Action Task Ruft Action auf dem Hauptthread auf, und wartet auf den Abschluss
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> Ruft Func<Task<T>> auf dem Hauptthread auf, und wartet auf den Abschluss
InvokeOnMainThreadAsync Func<Task> Task Ruft Func<Task> auf dem Hauptthread auf, und wartet auf den Abschluss
GetMainThreadSynchronizationContextAsync Task<SynchronizationContext> Gibt SynchronizationContext für den Hauptthread zurück

API

Auf Channel 9 und auf YouTube finden Sie weitere Videos zu Xamarin.