Xamarin.Essentials: MainThread

La classe MainThread consente alle applicazioni di eseguire il codice sul thread principale di esecuzione e di determinare se un particolare blocco di codice è attualmente in esecuzione sul thread principale.

Background

La maggior parte dei sistemi operativi, tra cui iOS, Android e la piattaforma UWP, usa un modello a thread 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 definito thread principale o thread dell'interfaccia utente o thread UI. Lo svantaggio di questo modello è che tutto il codice che accede a elementi dell'interfaccia utente deve essere eseguito sul thread principale dell'applicazione.

Le applicazioni devono talvolta usare eventi che chiamano il gestore dell'evento su un thread secondario di esecuzione. Le Xamarin.Essentials classi Accelerometer, Compass, GyroscopeMagnetometer, e OrientationSensor tutte potrebbero restituire informazioni su un thread secondario quando vengono usate con velocità più veloci. Se il gestore eventi deve accedere agli elementi dell'interfaccia utente, deve eseguire tale codice nel thread principale. La classe MainThread consente all'applicazione di eseguire questo codice sul thread principale.

Operazioni preliminari

Per iniziare a usare questa API, leggere la guida introduttiva per Xamarin.Essentials assicurarsi che la libreria sia installata e configurata correttamente nei progetti.

Esecuzione del codice sul thread principale

Aggiungere un riferimento a Xamarin.Essentials nella classe :

using Xamarin.Essentials;

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 che deve essere eseguito sul thread principale:

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

Sarà quindi possibile eseguire questo metodo sul thread principale facendovi riferimento nel metodo BeginInvokeOnMainThread:

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Nota

Xamarin.Forms ha un metodo denominato Device.BeginInvokeOnMainThread(Action) che fa la stessa cosa di MainThread.BeginInvokeOnMainThread(Action). Anche se è possibile usare uno dei metodi in un'app Xamarin.Forms , valutare se il codice chiamante ha altre esigenze per una dipendenza da Xamarin.Forms. In caso negativo, MainThread.BeginInvokeOnMainThread(Action) è probabilmente un'opzione migliore.

Determinare se il codice è in esecuzione sul thread principale

La classe MainThread consente anche a un'applicazione di determinare se un particolare blocco di codice è in esecuzione sul thread principale. La proprietà IsMainThread restituisce true se il codice che chiama la proprietà è in esecuzione sul thread principale. Un programma può usare questa proprietà per eseguire codice diverso per il thread principale o un thread secondario:

if (MainThread.IsMainThread)
{
    // Code to run if this is the main thread
}
else
{
    // Code to run if this is a secondary thread
}

Ci si potrebbe chiedere se è necessario controllare se il codice è in esecuzione su un thread secondario prima di chiamare BeginInvokeOnMainThread, ad esempio, come segue:

if (MainThread.IsMainThread)
{
    MyMainThreadCode();
}
else
{
    MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
}

Si potrebbe credere che questo controllo possa migliorare le prestazioni se il blocco di codice è già in esecuzione sul thread principale.

Tuttavia, questo controllo non è necessario. Le implementazioni della piattaforma di BeginInvokeOnMainThread stesse controllano se la chiamata viene eseguita sul thread principale. L'impatto sulle prestazioni è molto limitato se si chiama BeginInvokeOnMainThread quando non è effettivamente necessario.

Altri metodi

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 Valori restituiti 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.

API

Altri video di Xamarin sono disponibili su Channel 9 e YouTube.