Criar um thread no thread .NET MAUI UI

Browse sample. Navegue pelo exemplo

Este artigo descreve como você pode usar a classe .NET Multi-platform App UI (.NET MAUI) MainThread para executar código no thread de interface do usuário principal. A maioria dos sistemas operacionais usa um modelo de thread único para código envolvendo a interface do usuário. Esse modelo é necessário para serializar adequadamente os eventos da interface do usuário, incluindo pressionamentos de tecla e entrada de toque. Esse thread geralmente é chamado de thread principal, thread da interface do usuário ou thread da interface do usuário. A desvantagem desse modelo é que todo código que acessa os elementos da interface do usuário deve ser executado no thread principal do aplicativo.

A classe MainThread está disponível no namespace Microsoft.Maui.ApplicationModel.

Quando é necessário

Às vezes, os aplicativos precisam usar eventos que chamam o manipulador de eventos em um thread secundário, como os Accelerometer sensores ou Compass . Todos os sensores podem retornar informações em uma rosca secundária quando usados com velocidades de detecção mais rápidas. Se o manipulador de eventos precisar acessar elementos da interface do usuário, ele deverá invocar o código no thread principal.

Executar código no thread da interface do usuário

Para executar o código no thread principal, chame o método MainThread.BeginInvokeOnMainThread estático. O argumento é um objeto Action, que é simplesmente um método sem argumentos e sem valor de retorno:

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

Também é possível definir um método separado para o código e, em seguida, chamar esse código com o BeginInvokeOnMainThread método:

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

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Determine se a invocação é necessária

Com a MainThread classe, você pode determinar se o código atual está sendo executado no thread principal. A MainThread.IsMainThread propriedade retorna true se o código que chama a propriedade estiver em execução no thread principal e false se não estiver. É lógico supor que você precisa determinar se o código está sendo executado no thread principal antes de chamar MainThread.BeginInvokeOnMainThread. Por exemplo, o código a seguir usa o para detectar se o método deve ser chamado diretamente se o IsMainThreadMyMainThreadCode código estiver sendo executado no thread principal. Se ele não estiver sendo executado no thread principal, o método será passado para BeginInvokeOnMainThread:

if (MainThread.IsMainThread)
    MyMainThreadCode();

else
    MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Essa verificação não é necessária. BeginInvokeOnMainThread testa se o código atual está sendo executado no thread principal ou não. Se o código estiver sendo executado no thread principal, BeginInvokeOnMainThread basta chamar o método fornecido diretamente. Se o código estiver sendo executado em um thread secundário, BeginInvokeOnMainThread invocará o método fornecido no thread principal. Portanto, se o código executado for o mesmo, independentemente do thread principal ou secundário, basta ligar BeginInvokeOnMainThread sem verificar se é necessário. Há uma sobrecarga insignificante em fazê-lo.

A única razão pela qual você precisaria verificar a IsMainThread propriedade é se você tiver lógica de ramificação que faz algo diferente com base no thread.

Métodos adicionais

A classe MainThread inclui os seguintes métodos static adicionais que podem ser usados para interagir com elementos da interface do usuário dos threads em segundo plano:

Método Argumentos Retornos Finalidade
InvokeOnMainThreadAsync<T> Func<T> Task<T> Invoca um Func<T> no thread principal e aguarda sua conclusão.
InvokeOnMainThreadAsync Action Task Invoca um Action no thread principal e aguarda sua conclusão.
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> Invoca um Func<Task<T>> no thread principal e aguarda sua conclusão.
InvokeOnMainThreadAsync Func<Task> Task Invoca um Func<Task> no thread principal e aguarda sua conclusão.
GetMainThreadSynchronizationContextAsync Task<SynchronizationContext> Retorna o SynchronizationContext para o thread principal.