Oggi mi chiedevo come trasformare un elenco di attività attendendo ciascuna di esse. consideri il seguente esempio:Trasforma IEnumerable <Task<T>> in modo asincrono in attesa di ogni attività
private static void Main(string[] args)
{
try
{
Run(args);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.ReadLine();
}
}
static async Task Run(string[] args)
{
//Version 1: does compile, but ugly and List<T> overhead
var tasks1 = GetTasks();
List<string> gainStrings1 = new List<string>();
foreach (Task<string> task in tasks1)
{
gainStrings1.Add(await task);
}
Console.WriteLine(string.Join("", gainStrings1));
//Version 2: does not compile
var tasks2 = GetTasks();
IEnumerable<string> gainStrings2 = tasks2.Select(async t => await t);
Console.WriteLine(string.Join("", gainStrings2));
}
static IEnumerable<Task<string>> GetTasks()
{
string[] messages = new[] { "Hello", " ", "async", " ", "World" };
for (int i = 0; i < messages.Length; i++)
{
TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
tcs.SetResult(messages[i]);
yield return tcs.Task;
}
}
Mi piacerebbe trasformare la mia lista di compiti senza foreach, tuttavia sia la sintassi di funzione anonima, né la solita sintassi della funzione mi permette di fare quello che il mio foreach fa.
Devo fare affidamento sul mio foreach e sul List<T>
o c'è un modo per farlo funzionare con IEnumerable<T>
e tutti i suoi vantaggi?
Perché il secondo non compilare? Qual è il messaggio di errore? Si compila se aggiungi il 'ToList()' mancante dopo il 'Select'? –
perché restituisce 'IEnumerable>'. –
GameScripting