Créer un thread sur le thread d’interface utilisateur .NET MAUI
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. |