Diciamo che ho un paio di compiti:Esiste un modo predefinito per ottenere la prima attività completata correttamente?
void Sample(IEnumerable<int> someInts)
{
var taskList = someInts.Select(x => DownloadSomeString(x));
}
async Task<string> DownloadSomeString(int x) {...}
voglio per ottenere il risultato della prima operazione di successo. Quindi, la soluzione di base è quella di scrivere qualcosa di simile:
var taskList = someInts.Select(x => DownloadSomeString(x));
string content = string.Empty;
Task<string> firstOne = null;
while (string.IsNullOrWhiteSpace(content)){
try
{
firstOne = await Task.WhenAny(taskList);
if (firstOne.Status != TaskStatus.RanToCompletion)
{
taskList = taskList.Where(x => x != firstOne);
continue;
}
content = await firstOne;
}
catch(...){taskList = taskList.Where(x => x != firstOne);}
}
Ma questa soluzione sembra funzionare N
+ (N
-1) + .. + K
compiti. Dove N
è someInts.Count
e K
è la posizione della prima attività riuscita nelle attività, in modo da eseguire di nuovo tutte le attività tranne una che viene acquisita da WhenAny. Quindi, esiste un modo per ottenere la prima attività completata correttamente con l'esecuzione di massimo N
attività? (Se compito di successo sarà l'ultima)
Mi sembra che tu voglia eseguire le attività in sequenza, non in parallelo, giusto? –
Se vuoi eseguirli in parallelo, allora 'var taskList = someInts.Select (x => DownloadSomeString (x)). ToList()' dovrebbe funzionare per te. –
Se vuoi eseguirli in sequenza, allora un semplice ciclo 'for' dovrebbe fare il lavoro. –