Resumo : neste tutorial, você aprenderá como usar o WhenAny()
método estático C# da Task
classe 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 Task
classe 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
await
palavra-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
await
palavra-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 number
após um atraso de ms
milissegundos:
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 t1
e t2
use o Task.Run()
método. As tarefas executam o DoWork()
método com diferentes parâmetros:
t1
chamadaDoWork(1,1000)
que atrasa1000
milissegundos antes de retornar o número1
.t2
chamadaDoWork(2,500)
que atrasa500
milissegundos antes de retornar o número2
.
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 t1
ou 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 await
do 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 HttpClient
classe 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.