Criar um thread no thread .NET MAUI UI
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 IsMainThread
MyMainThreadCode
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. |