Xamarin.Essentials: MainThreadXamarin.Essentials: MainThread

Класс MainThread позволяет выполнять код в основном потоке приложения, а также проверять, выполняется ли конкретный блок кода в основном потоке в конкретный момент.The MainThread class allows applications to run code on the main thread of execution, and to determine if a particular block of code is currently running on the main thread.

ФонBackground

Большинство операционных систем, включая iOS, Android и универсальную платформу Windows, используют однопоточную модель для кода, имеющего отношение к пользовательскому интерфейсу.Most operating systems — including iOS, Android, and the Universal Windows Platform — use a single-threading model for code involving the user interface. Такая модель необходима для правильной сериализации событий пользовательского интерфейса, например нажатий клавиш и сенсорного ввода.This model is necessary to properly serialize user-interface events, including keystrokes and touch input. Этот поток может упоминаться как основной потоком, поток, обрабатывающий события от пользовательского интерфейса, или поток пользовательского интерфейса.This thread is often called the main thread or the user-interface thread or the UI thread. Недостатком этой модели является то, что весь код с доступом к элементам пользовательского интерфейса должен выполняться в основном потоке приложения.The disadvantage of this model is that all code that accesses user interface elements must run on the application's main thread.

Иногда приложениям приходится использовать события, которые вызывают обработчик событий во второстепенном потоке выполнения.Applications sometimes need to use events that call the event handler on a secondary thread of execution. (Классы Xamarin.Essentials Accelerometer, Compass, Gyroscope, Magnetometer, и OrientationSensor могут возвращать сведения во второстепенном потоке, если работают с высокой скоростью.) Если обработчику событий нужен доступ к элементам пользовательского интерфейса, он должен выполнять соответствующий код в основном потоке.(The Xamarin.Essentials classes Accelerometer, Compass, Gyroscope, Magnetometer, and OrientationSensor all might return information on a secondary thread when used with faster speeds.) If the event handler needs to access user-interface elements, it must run that code on the main thread. Класс MainThread позволяет приложениям выполнять код в основном потоке.The MainThread class allows the application to run this code on the main thread.

Начало работыGet started

Чтобы начать использовать этот API, ознакомьтесь с руководством по началу работы с Xamarin.Essentials, чтобы правильно настроить и установить библиотеку в проектах.To start using this API, read the getting started guide for Xamarin.Essentials to ensure the library is properly installed and set up in your projects.

Выполнение кода в основном потокеRunning Code on the Main Thread

Добавьте в свой класс ссылку на Xamarin.Essentials:Add a reference to Xamarin.Essentials in your class:

using Xamarin.Essentials;

Чтобы запустить код в основном потоке, вызовите статический метод MainThread.BeginInvokeOnMainThread.To run code on the main thread, call the static MainThread.BeginInvokeOnMainThread method. Он принимает в качестве аргумента объект Action, который представляет собой метод без аргументов и возвращаемых значений:The argument is an Action object, which is simply a method with no arguments and no return value:

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

Также есть возможность определить отдельный метод для кода, который должен выполняться в основном потоке:It is also possible to define a separate method for the code that must run on the main thread:

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

Вы сможете запустить этот метод в основном потоке, передав ссылку на него в метод BeginInvokeOnMainThread:You can then run this method on the main thread by referencing it in the BeginInvokeOnMainThread method:

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Примечание

Xamarin.Forms содержит метод с именем Device.BeginInvokeOnMainThread(Action),Xamarin.Forms has a method called Device.BeginInvokeOnMainThread(Action) который делает то же, что и MainThread.BeginInvokeOnMainThread(Action).that does the same thing as MainThread.BeginInvokeOnMainThread(Action). Вы можете использовать в приложении Xamarin.Forms любой из этих методов, но при выборе желательно учитывать, есть ли у вызывающего кода любая другая зависимость от Xamarin.Forms.While you can use either method in a Xamarin.Forms app, consider whether or not the calling code has any other need for a dependency on Xamarin.Forms. Если такой зависимости нет, обычно лучше использовать MainThread.BeginInvokeOnMainThread(Action).If not, MainThread.BeginInvokeOnMainThread(Action) is likely a better option.

Определение того, выполняется ли код в основном потокеDetermining if Code is Running on the Main Thread

Класс MainThread позволяет приложению определить, выполняется ли конкретный блок кода в основном потоке.The MainThread class also allows an application to determine if a particular block of code is running on the main thread. Свойство IsMainThread возвращает значение true, если обращающийся к нему код выполняется в основном потоке.The IsMainThread property returns true if the code calling the property is running on the main thread. Программа может использовать это свойство, чтобы условно запускать другой код в основном или второстепенном потоке:A program can use this property to run different code for the main thread or a secondary thread:

if (MainThread.IsMainThread)
{
    // Code to run if this is the main thread
}
else
{
    // Code to run if this is a secondary thread
}

Возможно, у вас возникло желание проверять поток выполнения кода перед вызовом BeginInvokeOnMainThread, например так:You might wonder if you should check if code is running on a secondary thread before calling BeginInvokeOnMainThread, for example, like this:

if (MainThread.IsMainThread)
{
    MyMainThreadCode();
}
else
{
    MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
}

Можно предположить, что такая проверка может повысить производительность, если блок кода уже выполняется в основном потоке.You might suspect that this check might improve performance if the block of code is already running on the main thread.

Но на самом деле эта проверка не нужна.However, this check is not necessary. Все реализации платформ BeginInvokeOnMainThread самостоятельно проверяют, выполняется ли вызов из основного потока.The platform implementations of BeginInvokeOnMainThread themselves check if the call is made on the main thread. Если вы будете вызывать метод BeginInvokeOnMainThread без реальной необходимости, это приведет к небольшому снижению производительности.There is very little performance penalty if you call BeginInvokeOnMainThread when it's not really necessary.

APIAPI