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

Další videa Xamarin najdete na webu Channel 9 a YouTube.