Xamarin.Essentials: MainThread
Klasa MainThread umożliwia aplikacjom uruchamianie kodu w głównym wątku wykonywania i określenie, czy dany blok kodu jest obecnie uruchomiony w głównym wątku.
Tło
Większość systemów operacyjnych — w tym systemów iOS, Android i platforma uniwersalna systemu Windows — 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ęć i wejść dotykowych. Ten wątek jest często nazywany głównym wątkiem lub 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.
Aplikacje czasami muszą używać zdarzeń wywołujących program obsługi zdarzeń w pomocniczym wątku wykonywania. (Klasy Xamarin.Essentials Accelerometer
, , Compass
Gyroscope
, Magnetometer
i OrientationSensor
wszystkie mogą zwracać informacje o wątku pomocniczym, gdy są używane z szybszymi szybkościami). Jeśli program obsługi zdarzeń musi uzyskać dostęp do elementów interfejsu użytkownika, musi uruchomić ten kod w głównym wątku. Klasa MainThread umożliwia aplikacji uruchamianie tego kodu w głównym wątku.
Rozpocznij
Aby rozpocząć korzystanie z tego interfejsu API, przeczytaj przewodnik wprowadzający , Xamarin.Essentials aby upewnić się, że biblioteka jest prawidłowo zainstalowana i skonfigurowana w projektach.
Uruchamianie kodu w wątku głównym
Dodaj odwołanie do Xamarin.Essentials klasy:
using Xamarin.Essentials;
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
});
Istnieje również możliwość zdefiniowania oddzielnej metody dla kodu, który musi być uruchamiany w wątku głównym:
void MyMainThreadCode()
{
// Code to run on the main thread
}
Następnie możesz uruchomić tę metodę w wątku głównym, odwołując się do niej w metodzie BeginInvokeOnMainThread
:
MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
Uwaga
Xamarin.Forms ma metodę o nazwie Device.BeginInvokeOnMainThread(Action)
to robi to samo co MainThread.BeginInvokeOnMainThread(Action)
.
Chociaż można użyć metody w Xamarin.Forms aplikacji, należy rozważyć, czy kod wywołujący ma inną potrzebę zależności od Xamarin.Formsmetody . Jeśli tak nie jest, MainThread.BeginInvokeOnMainThread(Action)
jest to prawdopodobnie lepsza opcja.
Określanie, czy kod jest uruchomiony w wątku głównym
Klasa MainThread
umożliwia również aplikacji określenie, czy określony blok kodu jest uruchomiony w głównym wątku. Właściwość IsMainThread
zwraca true
wartość , jeśli kod wywołujący właściwość jest uruchomiony w głównym wątku. Program może używać tej właściwości do uruchamiania innego kodu dla wątku głównego lub wątku pomocniczego:
if (MainThread.IsMainThread)
{
// Code to run if this is the main thread
}
else
{
// Code to run if this is a secondary thread
}
Możesz się zastanawiać, czy kod jest uruchomiony w wątku pomocniczym przed wywołaniem BeginInvokeOnMainThread
metody , na przykład w następujący sposób:
if (MainThread.IsMainThread)
{
MyMainThreadCode();
}
else
{
MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
}
Można podejrzewać, że ta kontrola może poprawić wydajność, jeśli blok kodu jest już uruchomiony w głównym wątku.
Jednak ta kontrola nie jest konieczna. Implementacje platformy BeginInvokeOnMainThread
sprawdzają, czy wywołanie jest wykonywane w głównym wątku. Istnieje bardzo mała kara za wydajność, jeśli wywołasz BeginInvokeOnMainThread
metodę , gdy nie jest to naprawdę konieczne.
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:
Method | Argumenty | Zwraca | Purpose |
---|---|---|---|
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. |
interfejs API
Powiązany film wideo
Więcej filmów na platformie Xamarin można znaleźć w witrynach Channel 9 i YouTube.