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

Parcourir l'exemple. 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 correctement les événements d’interface utilisateur, notamment les séquences de touches et l’entrée tactile. Ce thread est souvent appelé thread principal, thread d’interface utilisateur ou thread d’interface utilisateur. L’inconvénient de ce modèle 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, tels que les capteurs Accelerometer ou Compass. 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 Action objet, qui est simplement une méthode sans arguments et aucune valeur de retour :

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);

Pour ce scénario, cette vérification 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 vérifier s’il est nécessaire. Il y a une surcharge négligeable dans ce cas.

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

Méthodes supplémentaires

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

Méthode Les arguments Retours Objectif
InvokeOnMainThreadAsync<T> Func<T> Task<T> Invoque un Func<T> sur le thread principal et attend qu'il se termine.
InvokeOnMainThreadAsync Action Task Appelle un Action sur le thread principal et attend qu'il soit terminé.
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> Invoque un Func<Task<T>> sur le thread principal et attend qu'il se termine.
InvokeOnMainThreadAsync Func<Task> Task Invoque un Func<Task> sur le thread principal et attend qu'il se termine.
GetMainThreadSynchronizationContextAsync Task<SynchronizationContext> Retourne le SynchronizationContext thread principal.