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.
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.Essentials Accelerometer
, , Compass
Gyroscope
Magnetometer
, 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ě.
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.
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.
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 BeginInvokeOnMainThread
mě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.
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. |