Sdílet prostřednictvím


Vytvoření vlákna ve vlákně uživatelského rozhraní .NET MAUI

Browse sample. Procházení ukázky

Tento článek popisuje, jak můžete pomocí třídy .NET Multi-Platform App UI (.NET MAUI) MainThread spouštět kód v hlavním vlákně uživatelského rozhraní. Většina operačních systémů používá pro kód zahrnující uživatelské 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, 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.

Třída MainThread je k dispozici v Microsoft.Maui.ApplicationModel oboru názvů.

Kdy je požadováno

Aplikace někdy potřebují použít události, které volají obslužnou rutinu události v sekundárním vlákně, například senzoryAccelerometer.Compass Všechny senzory můžou vracet informace o sekundárním vlákně při použití s rychlejšími rychlostmi snímání. Pokud obslužná rutina události potřebuje přístup k prvkům uživatelského rozhraní, musí vyvolat kód v hlavním vlákně.

Spuštění kódu ve vlákně uživatelského rozhraní

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 a pak tento kód volat metodou BeginInvokeOnMainThread :

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

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Určení, jestli je vyžadováno vyvolání

MainThread Pomocí třídy můžete určit, jestli je aktuální kód spuštěný v hlavním vlákně. Tato MainThread.IsMainThread vlastnost vrátí true , pokud kód volající vlastnost je spuštěn v hlavním vlákně, a false pokud není. Je logické předpokládat, že je nutné určit, zda kód běží v hlavním vlákně před voláním MainThread.BeginInvokeOnMainThread. Například následující kód používá IsMainThread k detekci, zda MyMainThreadCode by metoda měla být volána přímo, pokud kód běží v hlavním vlákně. Pokud není spuštěný v hlavním vlákně, metoda se předá do BeginInvokeOnMainThread:

if (MainThread.IsMainThread)
    MyMainThreadCode();

else
    MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Tato kontrola není nutná. BeginInvokeOnMainThread testuje, zda je aktuální kód spuštěný v hlavním vlákně nebo ne. Pokud je kód spuštěný v hlavním vlákně, BeginInvokeOnMainThread jednoduše volá zadanou metodu přímo. Pokud kód běží v sekundárním vlákně, BeginInvokeOnMainThread vyvolá zadanou metodu v hlavním vlákně. Proto pokud je kód, který spustíte, stejný, bez ohledu na hlavní nebo sekundární vlákno, stačí volat BeginInvokeOnMainThread bez kontroly, jestli je to nutné. Při tom je zanedbatelná režie.

Jediný důvod, proč byste museli zkontrolovat IsMainThread vlastnost, je, pokud máte logiku větvení, která provádí něco jiného na základě vlákna.

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 Vrácení Úč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.