Xamarin.Essentials: MainThreadXamarin.Essentials: MainThread

La clase MainThread permite que las aplicaciones ejecuten código en el subproceso de ejecución principal y determinen si un bloque de código determinado se ejecuta actualmente en el subproceso principal.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.

FondoBackground

La mayoría de los sistemas operativos, incluidos iOS, Android y Plataforma universal de Windows, usan un modelo de un único subproceso para el código que participa en la interfaz de usuario.Most operating systems — including iOS, Android, and the Universal Windows Platform — use a single-threading model for code involving the user interface. Este modelo resulta necesario para serializar de manera adecuada los eventos de la interfaz de usuario, incluidas pulsaciones de teclas y entradas táctiles.This model is necessary to properly serialize user-interface events, including keystrokes and touch input. Con frecuencia, este subproceso se denomina el subproceso principal, el subproceso de interfaz de usuario o el subproceso de UI.This thread is often called the main thread or the user-interface thread or the UI thread. La desventaja que presenta este modelo es que todo el código que accede a los elementos de la interfaz de usuario se deben ejecutar en el subproceso principal de la aplicación.The disadvantage of this model is that all code that accesses user interface elements must run on the application's main thread.

Algunas veces, las aplicaciones deben usar eventos que llamar al controlador de eventos en un subproceso de ejecución secundario.Applications sometimes need to use events that call the event handler on a secondary thread of execution. (Es posible que las clases Accelerometer, Compass, Gyroscope, Magnetometer y OrientationSensor de Xamarin.Essentials devuelvan información en un subproceso secundario cuando se usa con velocidades más rápidas). Si el controlador de eventos debe acceder a los elementos de la interfaz de usuario, debe ejecutar ese código en el subproceso principal.(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. La clase MainThread permite que la aplicación ejecute este código en el subproceso principal.The MainThread class allows the application to run this code on the main thread.

Primeros pasosGet started

Para empezar a usar esta API, lea la guía de introducción para Xamarin.Essentials con el fin de asegurarse de que la biblioteca está correctamente instalada y configurada en los proyectos.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.

Ejecución de código en el subproceso principalRunning Code on the Main Thread

Agregue una referencia a Xamarin.Essentials en su clase:Add a reference to Xamarin.Essentials in your class:

using Xamarin.Essentials;

Para ejecutar código en el subproceso principal, llame al método MainThread.BeginInvokeOnMainThread estático.To run code on the main thread, call the static MainThread.BeginInvokeOnMainThread method. El argumento es un objeto Action, que no es más que un método sin argumentos y sin valor devuelto: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
});

También es posible definir un método independiente para el código que se debe ejecutar en el subproceso principal: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
}

Luego, para ejecutar este método en el subproceso principal, haga referencia a él en el método BeginInvokeOnMainThread:You can then run this method on the main thread by referencing it in the BeginInvokeOnMainThread method:

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Nota

Xamarin.Forms tiene un método llamado Device.BeginInvokeOnMainThread(Action)Xamarin.Forms has a method called Device.BeginInvokeOnMainThread(Action) que hace lo mismo que MainThread.BeginInvokeOnMainThread(Action).that does the same thing as MainThread.BeginInvokeOnMainThread(Action). Si bien puede usar cualquier método en una aplicación de Xamarin.Forms, considere si el código de llamada necesita o no una dependencia de 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. Si no es así, MainThread.BeginInvokeOnMainThread(Action) probablemente sea una mejor opción.If not, MainThread.BeginInvokeOnMainThread(Action) is likely a better option.

Determinación de si el código se ejecuta en el subproceso principalDetermining if Code is Running on the Main Thread

La clase MainThread también permite que una aplicación determine si un bloque de código determinado se ejecuta en el subproceso principal.The MainThread class also allows an application to determine if a particular block of code is running on the main thread. La propiedad IsMainThread devuelve true si el código que llama a la propiedad se ejecuta en el subproceso principal.The IsMainThread property returns true if the code calling the property is running on the main thread. Un programa puede usar esta propiedad para ejecutar código diferente para el subproceso principal o secundario: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
}

Tal vez se pregunte si debe comprobar que el código se esté ejecutando en un subproceso secundario antes de llamar a BeginInvokeOnMainThread, por ejemplo, de esta manera: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);
}

Quizás sospeche que esta comprobación puede mejorar el rendimiento si el bloque de código ya se ejecuta en el subproceso principal.You might suspect that this check might improve performance if the block of code is already running on the main thread.

Sin embargo, esta comprobación no es necesaria.However, this check is not necessary. Las implementaciones de plataforma de los BeginInvokeOnMainThread mismos comprueban si la llamada se realiza en el subproceso principal.The platform implementations of BeginInvokeOnMainThread themselves check if the call is made on the main thread. La penalización de rendimiento si llama a BeginInvokeOnMainThread cuando no es realmente necesario es muy pequeña.There is very little performance penalty if you call BeginInvokeOnMainThread when it's not really necessary.

APIAPI