using System.Collections.Generic;
using System.Threading.Tasks;
static async Task Main(string[] args)
var numbers = new int[] { 1, 2, 3 };
var numberStrings = GetNumberStringsAsync(numbers);
await foreach (var numberString in numberStrings)
Console.WriteLine($"{numberString.Item1} = {numberString.Item2}");
static async IAsyncEnumerable<(int, string)> GetNumberStringsAsync(int[] numbers)
var tasks = numbers.Select(GetNumberStringAsync).ToList();
var completedTask = await Task.WhenAny(tasks);
tasks.Remove(completedTask);
yield return completedTask.Result;
private static async Task<(int, string)> GetNumberStringAsync(int number)
var result = await NumberToStringAsync(number);
private static async Task<string> NumberToStringAsync(int number)
return number.ToString();