Xamarin.Essentials: MainThread

Třída MainThread umožňuje aplikacím spouštět kód v hlavním vlákně provádění a určit, zda je v hlavním vlákně aktuálně spuštěný konkrétní blok kódu.

Pozadí

Většina operačních systémů, včetně iOS, Androidu a Univerzální platforma Windows, používá pro kód uživatelského rozhraní model s jedním vláknem. Tento model je nezbytný k správné serializaci událostí uživatelského rozhraní, včetně stisknutí kláves a dotykového vstupu. Toto vlákno se často označuje jako hlavní vlákno nebo vlákno uživatelského rozhraní nebo vlákno uživatelského rozhraní. Nevýhodou tohoto modelu je, že veškerý kód, který přistupuje k prvkům uživatelského rozhraní, musí běžet v hlavním vlákně aplikace.

Aplikace někdy potřebují použít události, které volají obslužnou rutinu události v sekundárním vlákně provádění. (Třídy Xamarin.EssentialsAccelerometer, , CompassGyroscopeMagnetometer, a OrientationSensor všechny mohou vracet informace na sekundární vlákno při použití s rychlejší rychlostí.) Pokud obslužná rutina události potřebuje přístup k prvkům uživatelského rozhraní, musí tento kód spustit v hlavním vlákně. Třída MainThread umožňuje aplikaci spustit tento kód v hlavním vlákně.

Začínáme

Pokud chcete začít používat toto rozhraní API, přečtěte si úvodní příručkuXamarin.Essentials, abyste měli jistotu, že je knihovna správně nainstalovaná a nastavená ve vašich projektech.

Spuštění kódu v hlavním vlákně

Přidejte do Xamarin.Essentials předmětu odkaz:

using Xamarin.Essentials;

Pokud chcete spustit kód v hlavním vlákně, zavolejte statickou MainThread.BeginInvokeOnMainThread metodu. Argument je Action objekt, což je jednoduše metoda bez argumentů a bez návratové hodnoty:

MainThread.BeginInvokeOnMainThread(() =>
{
    // Code to run on the main thread
});

Je také možné definovat samostatnou metodu pro kód, který musí běžet v hlavním vlákně:

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

Tuto metodu pak můžete spustit v hlavním vlákně tak, že na ni v BeginInvokeOnMainThread metodě odkazujete:

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Poznámka:

Xamarin.Forms má volánou metodu. Device.BeginInvokeOnMainThread(Action) to dělá totéž jako MainThread.BeginInvokeOnMainThread(Action). I když můžete použít některou Xamarin.Forms z metod v aplikaci, zvažte, zda volající kód má jakoukoli jinou potřebu závislosti na Xamarin.Forms. Pokud ne, MainThread.BeginInvokeOnMainThread(Action) je pravděpodobně lepší volbou.

Určení, jestli je kód spuštěný v hlavním vlákně

Třída MainThread také umožňuje aplikaci určit, zda je v hlavním vlákně spuštěn určitý blok kódu. Vlastnost IsMainThread vrátí true , pokud kód volající vlastnost je spuštěn v hlavním vlákně. Program může použít tuto vlastnost ke spuštění jiného kódu pro hlavní vlákno nebo sekundární vlákno:

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

Možná vás zajímá, jestli byste před voláním BeginInvokeOnMainThreadměli zkontrolovat, jestli je kód spuštěný v sekundárním vlákně, například takto:

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

Můžete mít podezření, že tato kontrola může zvýšit výkon, pokud blok kódu už běží v hlavním vlákně.

Tato kontrola však není nutná. Implementace platformy BeginInvokeOnMainThread samy zkontrolují, jestli se volání provádí v hlavním vlákně. Pokud zavoláte BeginInvokeOnMainThread , když to opravdu není nutné, je velmi malý trest za výkon.

Další metody

Třída MainThread obsahuje následující další static metody, které lze použít k interakci s prvky uživatelského rozhraní z vláken pozadí:

metoda Argumenty Návraty Účel
InvokeOnMainThreadAsync<T> Func<T> Task<T> Func<T> Vyvolá hlavní vlákno a počká na jeho dokončení.
InvokeOnMainThreadAsync Action Task Vyvolá hlavní Action vlákno a počká na jeho dokončení.
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> Func<Task<T>> Vyvolá hlavní vlákno a počká na jeho dokončení.
InvokeOnMainThreadAsync Func<Task> Task Func<Task> Vyvolá hlavní vlákno a počká na jeho dokončení.
GetMainThreadSynchronizationContextAsync Task<SynchronizationContext> SynchronizationContext Vrátí hodnotu pro hlavní vlákno.

rozhraní API

Další videa o Xamarinu najdete na Channel 9 a YouTube.