Udostępnij za pośrednictwem


Tworzenie wątku w wątku interfejsu użytkownika maui platformy .NET

Browse sample. Przeglądanie przykładu

W tym artykule opisano sposób użycia klasy interfejsu użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI) MainThread do uruchamiania kodu w głównym wątku interfejsu użytkownika. Większość systemów operacyjnych używa modelu jednowątkowego dla kodu obejmującego interfejs użytkownika. Ten model jest niezbędny do prawidłowego serializowania zdarzeń interfejsu użytkownika, w tym naciśnięć klawiszy i wejść dotykowych. Ten wątek jest często nazywany wątkiem głównym, wątkiem interfejsu użytkownika lub wątkiem interfejsu użytkownika. Wadą tego modelu jest to, że cały kod, który uzyskuje dostęp do elementów interfejsu użytkownika, musi działać w głównym wątku aplikacji.

Klasa MainThread jest dostępna w Microsoft.Maui.ApplicationModel przestrzeni nazw.

Gdy jest to wymagane

Aplikacje czasami muszą używać zdarzeń wywołujących program obsługi zdarzeń w wątku pomocniczym, takich jak Accelerometer czujniki lub Compass . Wszystkie czujniki mogą zwracać informacje o wątku pomocniczym, gdy są używane z szybszymi szybkościami wykrywania. Jeśli program obsługi zdarzeń musi uzyskać dostęp do elementów interfejsu użytkownika, musi wywołać kod w głównym wątku.

Uruchamianie kodu w wątku interfejsu użytkownika

Aby uruchomić kod w wątku głównym, wywołaj metodę statyczną MainThread.BeginInvokeOnMainThread . Argument jest obiektem Action , który jest po prostu metodą bez argumentów i bez zwracanej wartości:

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

Można również zdefiniować oddzielną metodę dla kodu, a następnie wywołać ten kod za BeginInvokeOnMainThread pomocą metody :

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

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Określanie, czy jest wymagane wywołanie

Za pomocą MainThread klasy można określić, czy bieżący kod jest uruchomiony w głównym wątku. Właściwość MainThread.IsMainThread zwraca true wartość , jeśli kod wywołujący właściwość jest uruchamiany w wątku głównym, a false jeśli tak nie jest. Należy założyć, że należy ustalić, czy kod jest uruchomiony w głównym wątku przed wywołaniem metody MainThread.BeginInvokeOnMainThread. Na przykład poniższy kod używa metody IsMainThread , aby wykryć, czy MyMainThreadCode metoda powinna być wywoływana bezpośrednio, jeśli kod jest uruchomiony w głównym wątku. Jeśli w wątku głównym nie jest uruchomiona, metoda jest przekazywana do BeginInvokeOnMainThreadmetody :

if (MainThread.IsMainThread)
    MyMainThreadCode();

else
    MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

To sprawdzenie nie jest konieczne. BeginInvokeOnMainThread sam testuje, czy bieżący kod jest uruchomiony w głównym wątku, czy nie. Jeśli kod jest uruchomiony w wątku głównym, BeginInvokeOnMainThread po prostu wywołuje podaną metodę bezpośrednio. Jeśli kod jest uruchamiany w wątku pomocniczym, BeginInvokeOnMainThread wywołuje podaną metodę w wątku głównym. W związku z tym, jeśli uruchamiany kod jest taki sam, niezależnie od głównego lub pomocniczego wątku, po prostu wywołaj BeginInvokeOnMainThread polecenie bez sprawdzania, czy jest to wymagane. W ten sposób nie ma niewielkiego nakładu pracy.

Jedynym powodem, dla którego należy sprawdzić IsMainThread właściwość, jest to, że masz logikę rozgałęziania, która wykonuje coś innego w oparciu o wątek.

Dodatkowe metody

Klasa MainThread zawiera następujące dodatkowe static metody, które mogą służyć do interakcji z elementami interfejsu użytkownika z wątków tła:

Metoda Argumenty Powroty Przeznaczenie
InvokeOnMainThreadAsync<T> Func<T> Task<T> Wywołuje element Func<T> w wątku głównym i czeka na jego ukończenie.
InvokeOnMainThreadAsync Action Task Wywołuje element Action w wątku głównym i czeka na jego ukończenie.
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> Wywołuje element Func<Task<T>> w wątku głównym i czeka na jego ukończenie.
InvokeOnMainThreadAsync Func<Task> Task Wywołuje element Func<Task> w wątku głównym i czeka na jego ukończenie.
GetMainThreadSynchronizationContextAsync Task<SynchronizationContext> Zwraca wartość SynchronizationContext dla głównego wątku.