Partager via


Créer un thread sur le thread d’interface utilisateur .NET MAUI

Browse sample. Parcourir l’exemple

Cet article explique comment utiliser la classe .NET Multiplateforme App UI (.NET MAUI) MainThread pour exécuter du code sur le thread d’interface utilisateur principal. La plupart des systèmes d’exploitation utilisent un modèle de thread unique pour le code impliquant l’interface utilisateur. Ce modèle est nécessaire pour sérialiser les événements de l’interface utilisateur, et en particulier les frappes et entrées tactiles. Ce thread est souvent appelé thread principal, thread d’interface utilisateur ou thread d’interface utilisateur. Son inconvénient est que tout le code qui accède aux éléments d’interface utilisateur doit s’exécuter sur le thread principal de l’application.

La classe MainThread est disponible dans l’espace de noms Microsoft.Maui.ApplicationModel.

Quand il est nécessaire

Les applications doivent parfois utiliser des événements qui appellent le gestionnaire d’événements sur un thread secondaire, tel que les capteurs ou Compass les Accelerometer capteurs. Tous les capteurs peuvent retourner des informations sur un thread secondaire lorsqu’ils sont utilisés avec des vitesses de détection plus rapides. Si le gestionnaire d’événements doit accéder aux éléments de l’interface utilisateur, il doit appeler du code sur le thread principal.

Exécuter du code sur le thread d’interface utilisateur

Pour exécuter du code sur le thread principal, appelez la méthode statique MainThread.BeginInvokeOnMainThread. L’argument est un objet Action, qui consiste simplement en une méthode sans arguments ni valeur renvoyée :

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

Il est également possible de définir une méthode distincte pour le code, puis d’appeler ce code avec la BeginInvokeOnMainThread méthode :

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

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Déterminer si l’appel est requis

Avec la MainThread classe, vous pouvez déterminer si le code actuel est en cours d’exécution sur le thread principal. La MainThread.IsMainThread propriété retourne true si le code appelant la propriété s’exécute sur le thread principal et false s’il n’en est pas. Il est logique de supposer que vous devez déterminer si le code s’exécute sur le thread principal avant d’appeler MainThread.BeginInvokeOnMainThread. Par exemple, le code suivant utilise la IsMainThread méthode pour détecter si la MyMainThreadCode méthode doit être appelée directement si le code s’exécute sur le thread principal. S’il n’est pas en cours d’exécution sur le thread principal, la méthode est passée à BeginInvokeOnMainThread:

if (MainThread.IsMainThread)
    MyMainThreadCode();

else
    MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Cette case activée n’est pas nécessaire. BeginInvokeOnMainThread elle-même teste si le code actuel est en cours d’exécution sur le thread principal ou non. Si le code s’exécute sur le thread principal, BeginInvokeOnMainThread il vous suffit d’appeler directement la méthode fournie. Si le code s’exécute sur un thread secondaire, BeginInvokeOnMainThread appelle la méthode fournie sur le thread principal. Par conséquent, si le code que vous exécutez est le même, quel que soit le thread principal ou secondaire, appelez BeginInvokeOnMainThread simplement sans case activée ing s’il est nécessaire. Il y a une surcharge négligeable dans ce cas.

La seule raison pour laquelle vous devez case activée la IsMainThread propriété est si vous avez une logique de branchement qui fait quelque chose de différent en fonction du thread.

Autres méthodes

La classe MainThread comprend les méthodes static supplémentaires suivantes qui peuvent être utilisées pour interagir avec des éléments d’interface utilisateur à partir de threads d’arrière-plan :

Méthode Arguments Retours Objectif
InvokeOnMainThreadAsync<T> Func<T> Task<T> Appelle un Func<T> sur le thread principal, puis attend qu’il se termine.
InvokeOnMainThreadAsync Action Task Appelle un Action sur le thread principal, puis attend qu’il se termine.
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> Appelle un Func<Task<T>> sur le thread principal, puis attend qu’il se termine.
InvokeOnMainThreadAsync Func<Task> Task Appelle un Func<Task> sur le thread principal, puis attend qu’il se termine.
GetMainThreadSynchronizationContextAsync Task<SynchronizationContext> Retourne le SynchronizationContext pour le thread principal.