Condividi tramite


Creare un thread nel thread dell'interfaccia utente MAUI .NET

Browse sample. Esplorare l'esempio

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.