Tworzenie wątku w wątku interfejsu użytkownika maui platformy .NET
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 BeginInvokeOnMainThread
metody :
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. |