Xamarin.Essentials: MainThread
Třída MainThread umožňuje aplikacím spustit kód v hlavním vláknu 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 – pro kód zahrnující uživatelské rozhraní použijte model s jedním vláknem. Tento model je nezbytný pro správné serializaci událostí uživatelského rozhraní, včetně klávesových úhozů a dotykového vstupu. Toto vlákno se často nazývá hlavní vlákno nebo vlákno uživatelského rozhraní nebo vlákno uživatelskéhorozhraní. Nevýhodou tohoto modelu je, že veškerý kód, který přistupuje k prvkům uživatelského rozhraní, musí být spuštěn 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í. ( Xamarin.Essentials Třídy,,, AccelerometerCompassGyroscopeMagnetometer a OrientationSensor všechny mohou vracet informace v sekundárním vlákně 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í spustit tento kód 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 příručku Začínáme pro, 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ě
Do třídy přidejte odkaz Xamarin.Essentials :
using Xamarin.Essentials;
Chcete-li spustit kód v hlavním vlákně, zavolejte statickou MainThread.BeginInvokeOnMainThread metodu. Argument je Action objekt, který je jednoduše metodou bez argumentů a žádnou návratovou hodnotou:
MainThread.BeginInvokeOnMainThread(() =>
{
// Code to run on the main thread
});
Je také možné definovat samostatnou metodu pro kód, který musí být spuštěn 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 odkazujete v BeginInvokeOnMainThread metodě:
MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
Poznámka
Xamarin.Forms má metodu nazvanouDevice.BeginInvokeOnMainThread(Action) to má stejnou věc jako MainThread.BeginInvokeOnMainThread(Action) .
I když v aplikaci můžete použít kteroukoli z těchto metod Xamarin.Forms , zvažte, jestli má volající kód jinou potřebu závislosti na Xamarin.Forms . Pokud ne, MainThread.BeginInvokeOnMainThread(Action) je nejspíš lepší volbou.
Určení, jestli je kód spuštěný v hlavním vlákně
MainThreadTřída také umožňuje aplikaci určit, zda je v hlavním vlákně spuštěn konkrétní blok kódu. IsMainThreadVlastnost vrátí, true Pokud kód, který volá vlastnost, je spuštěn v hlavním vlákně. Program může tuto vlastnost použít ke spuštění jiného kódu hlavního vlákna nebo sekundárního vlákna:
if (MainThread.IsMainThread)
{
// Code to run if this is the main thread
}
else
{
// Code to run if this is a secondary thread
}
Můžete se setkat s tím, že byste měli zjistit, jestli je kód spuštěný na sekundárním vlákně před voláním BeginInvokeOnMainThread , například takto:
if (MainThread.IsMainThread)
{
MyMainThreadCode();
}
else
{
MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
}
Je možné, že tato kontrolu mohou zvýšit výkon, pokud je blok kódu již spuštěn v hlavním vlákně.
Tato kontrolu ale není nutná. Implementace platformy BeginInvokeOnMainThread samotné kontroly kontrolují, zda je volání provedeno v hlavním vlákně. Když zavoláte, BeginInvokeOnMainThread když ve skutečnosti není potřeba, je k dispozici velmi málo snížení výkonu.
Další metody
MainThreadTřída obsahuje následující dodatečné static metody, které lze použít pro interakci s prvky uživatelského rozhraní z vláken pozadí:
| Metoda | Argumenty | Návraty | Účel |
|---|---|---|---|
InvokeOnMainThreadAsync<T> |
Func<T> |
Task<T> |
Vyvolá Func<T> v hlavním vlákně a počká na jeho dokončení. |
InvokeOnMainThreadAsync |
Action |
Task |
Vyvolá Action v hlavním vlákně a počká na jeho dokončení. |
InvokeOnMainThreadAsync<T> |
Func<Task<T>> |
Task<T> |
Vyvolá Func<Task<T>> v hlavním vlákně a počká na jeho dokončení. |
InvokeOnMainThreadAsync |
Func<Task> |
Task |
Vyvolá Func<Task> v hlavním vlákně a počká na jeho dokončení. |
GetMainThreadSynchronizationContextAsync |
Task<SynchronizationContext> |
Vrátí SynchronizationContext pro hlavní vlákno. |
rozhraní API
- Xamarin. Essentials /MainThread "data-LINKTYPE =" external ">MainThread zdrojového kódu
- Dokumentace k rozhraní MainThread API