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ęć klawiszy 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.EssentialsAccelerometer, , CompassGyroscope, Magnetometeri 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 BeginInvokeOnMainThreadmetody , 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

Więcej filmów na platformie Xamarin można znaleźć w witrynach Channel 9 i YouTube.