C# QuandoQualquer

Resumo : neste tutorial, você aprenderá como usar o WhenAny()método estático C# da Taskclasse para criar uma tarefa que será concluída quando qualquer uma das tarefas de entrada for concluída.

Introdução ao método C# WhenAny()

O Task.WhenAny()é um método estático da Taskclasse que permite aguardar a conclusão da primeira tarefa em uma coleção de tarefas.

Quando uma tarefa é concluída, Task.WhenAny()retorna um Task<T>objeto que representa a tarefa concluída.

Para usar o Task.WhenAny()método, siga estas etapas:

  • Primeiro, passe uma coleção de tarefas para o método.
  • Em segundo lugar, use a awaitpalavra-chave para aguardar a conclusão de qualquer uma das tarefas da coleção.
  • Terceiro, atribua a tarefa concluída a uma variável e use a awaitpalavra-chave novamente para obter o resultado.

O método C# WhenAny()é útil quando você precisa fazer várias solicitações HTTP para APIs diferentes e processar o primeiro resultado.

Por exemplo, suponha que você tenha um aplicativo que exibe as últimas notícias de várias fontes, cada fonte possui uma API.

Para exibir as notícias o mais rápido possível, você pode usar o Task.WhenAny()método para aguardar a conclusão da primeira solicitação da API, exibir as notícias e continuar buscando as notícias de outras APIs em paralelo.

Um exemplo simples do método C# WhenAny()

O exemplo a seguir demonstra como usar o WhenAny()método:

static async Task<int> DoWork(int number, int ms)
{
    await Task.Delay(ms);
    return number;
}

var t1 = Task.Run(() => DoWork(1, 1000));
var t2 = Task.Run(() => DoWork(2, 500));

Task<int> completedTask = await Task.WhenAny(t1, t2);
int result = await completedTask;

Console.WriteLine(result);Linguagem de código:  JavaScript  ( javascript )

Como funciona.

Primeiro, defina o DoWork()método que aceita dois parâmetros: number, um número inteiro, e ms, um número de milissegundos. O método retorna numberapós um atraso de msmilissegundos:

static async Task<int> DoWork(int number, int ms)
{
    await Task.Delay(ms);
    return number;
}Linguagem de código:  JavaScript  ( javascript )

Segundo, crie duas tarefas t1e t2use o Task.Run()método. As tarefas executam o DoWork()método com diferentes parâmetros:

  • t1chamada DoWork(1,1000)que atrasa 1000milissegundos antes de retornar o número 1.
  • t2chamada DoWork(2,500)que atrasa 500milissegundos antes de retornar o número 2.
var t1 = Task.Run(() => DoWork(1, 1000));
var t2 = Task.Run(() => DoWork(2, 500));Linguagem de código:  JavaScript  ( javascript )

Terceiro, use o Task.WhenAny()método para aguardar a conclusão de um t1ou outro t2, o que terminar primeiro. Quando uma das tarefas é concluída, o Task.WhenAny()método retorna um Task<int>objeto que representa a tarefa concluída.

Task<int> completedTask = await Task.WhenAny(t1, t2);
int result = await completedTask;Linguagem de código:  JavaScript  ( javascript )

Quarto, use a palavra-chave para aguardar a conclusão awaitdo objeto e atribua o resultado à variável:Task<int>completedTask

int result = await completedTask;Linguagem de código:  JavaScript  ( javascript )

Por fim, envie o resultado para o console:

Console.WriteLine(result);Linguagem de código:  CSS  ( css )

Uso prático do método C# WhenAny()

O programa a seguir tenta baixar duas imagens de URLs diferentes e salva a primeira usando o método C# WhenAny():


// Define the URLs of the two images
string url1 = "https://via.placeholder.com/600/771796";
string url2 = "https://via.placeholder.com/600/24f355";

// Create two tasks to request the two images asynchronously
HttpClient client = new();

var t1 = client.GetByteArrayAsync(url1);
var t2 = client.GetByteArrayAsync(url2);

// Wait for the first task to complete
var completedTask = await Task.WhenAny(t1, t2);

// Save the result of the first task to a file
byte[] bytes = await completedTask;
string fileName = "image.jpg";
File.WriteAllBytes(fileName, bytes);

Console.WriteLine($"The picture has been saved to {fileName}");Linguagem de código:  JavaScript  ( javascript )

Como funciona.

Primeiro, defina as URLs das duas imagens para download:

string url1 = "https://via.placeholder.com/600/771796";
string url2 = "https://via.placeholder.com/600/24f355";Linguagem de código:  JavaScript  ( javascript )

Segundo, crie uma nova instância da HttpClientclasse para fazer solicitações HTTP:

HttpClient client = new();Linguagem de código:  C#  ( cs )

Terceiro, crie duas tarefas que baixem as duas imagens de forma assíncrona. O GetByteArrayAsync()método retorna um Task<byte[]>objeto:

var t1 = client.GetByteArrayAsync(url1);
var t2 = client.GetByteArrayAsync(url2);Linguagem de código:  C#  ( cs )

Quarto, use o método Task.WhenAny() para aguardar a conclusão da primeira tarefa:

var completedTask = await Task.WhenAny(t1, t2);Linguagem de código:  C#  ( cs )

Por fim, salve o resultado da primeira tarefa em um arquivo:

byte[] bytes = await completedTask;
string fileName = "image.jpg";
File.WriteAllBytes(fileName, bytes);

Console.WriteLine($"Saved the picture to {fileName}");Linguagem de código:  C#  ( cs )

Resumo

  • Use o método C# WhenAny()para aguardar a conclusão da primeira tarefa em uma coleção de tarefas.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *