Creare un thread nel thread dell'interfaccia utente MAUI .NET
Questo articolo descrive come usare la classe .NET Multi-platform App UI (.NET MAUI) MainThread per eseguire il codice nel thread principale dell'interfaccia utente. La maggior parte dei sistemi operativi usa un modello a threading singolo per il codice che coinvolge l'interfaccia utente. Questo modello è necessario per serializzare correttamente gli eventi dell'interfaccia utente, inclusi l'input tocco e le sequenze di tasti. Questo thread viene spesso chiamato thread principale, thread dell'interfaccia utente o thread dell'interfaccia utente. Lo svantaggio di questo modello è che tutto il codice che accede a elementi dell'interfaccia utente deve essere eseguito sul thread principale dell'applicazione.
La classe MainThread
è disponibile nello spazio dei nomi Microsoft.Maui.ApplicationModel
.
Quando è necessario
Le applicazioni talvolta devono usare eventi che chiamano il gestore eventi in un thread secondario, ad esempio i Accelerometer
sensori o Compass
. Tutti i sensori potrebbero restituire informazioni su un thread secondario quando vengono usati con velocità di rilevamento più veloci. Se il gestore eventi deve accedere agli elementi dell'interfaccia utente, deve richiamare il codice nel thread principale.
Eseguire il codice nel thread dell'interfaccia utente
Per eseguire codice sul thread principale, chiamare il metodo statico MainThread.BeginInvokeOnMainThread. L'argomento è un oggetto Action, che è semplicemente un metodo con nessun argomento e nessun valore restituito:
MainThread.BeginInvokeOnMainThread(() =>
{
// Code to run on the main thread
});
È anche possibile definire un metodo separato per il codice e quindi chiamare tale codice con il BeginInvokeOnMainThread
metodo :
void MyMainThreadCode()
{
// Code to run on the main thread
}
MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
Determinare se la chiamata è obbligatoria
Con la MainThread classe è possibile determinare se il codice corrente è in esecuzione nel thread principale. La MainThread.IsMainThread proprietà restituisce true
se il codice che chiama la proprietà è in esecuzione nel thread principale e false
, in caso contrario, . È logico presupporre che sia necessario determinare se il codice è in esecuzione nel thread principale prima di chiamare MainThread.BeginInvokeOnMainThread. Ad esempio, il codice seguente usa per IsMainThread
rilevare se il MyMainThreadCode
metodo deve essere chiamato direttamente se il codice è in esecuzione nel thread principale. Se non è in esecuzione nel thread principale, il metodo viene passato a BeginInvokeOnMainThread
:
if (MainThread.IsMainThread)
MyMainThreadCode();
else
MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
Questo controllo non è necessario. BeginInvokeOnMainThread
se stesso verifica se il codice corrente è in esecuzione nel thread principale o meno. Se il codice è in esecuzione nel thread principale, BeginInvokeOnMainThread
chiama direttamente il metodo fornito. Se il codice è in esecuzione in un thread secondario, BeginInvokeOnMainThread
richiama il metodo fornito nel thread principale. Pertanto, se il codice eseguito è lo stesso, indipendentemente dal thread principale o secondario, è sufficiente chiamare BeginInvokeOnMainThread
senza controllare se è necessario. Ciò comporta un sovraccarico trascurabile.
L'unico motivo per cui è necessario controllare la IsMainThread
proprietà è se si dispone di logica di diramazione che esegue operazioni diverse in base al thread.
Metodi aggiuntivi
La classe MainThread include i metodi static
aggiuntivi seguenti che possono essere usati per interagire con gli elementi dell'interfaccia utente dai thread di background:
metodo | Argomenti | Resi | Scopo |
---|---|---|---|
InvokeOnMainThreadAsync<T> |
Func<T> |
Task<T> |
Richiama un oggetto Func<T> sul thread principale e ne attende il completamento. |
InvokeOnMainThreadAsync |
Action |
Task |
Richiama un oggetto Action sul thread principale e ne attende il completamento. |
InvokeOnMainThreadAsync<T> |
Func<Task<T>> |
Task<T> |
Richiama un oggetto Func<Task<T>> sul thread principale e ne attende il completamento. |
InvokeOnMainThreadAsync |
Func<Task> |
Task |
Richiama un oggetto Func<Task> sul thread principale e ne attende il completamento. |
GetMainThreadSynchronizationContextAsync |
Task<SynchronizationContext> |
Restituisce l'oggetto SynchronizationContext per il thread principale. |
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per