Io uso un insieme di attività, a volte, e al fine di assicurarsi che essi sono tutti atteso che usano questo approccio:Perché questa eccezione non viene lanciata?
public async Task ReleaseAsync(params Task[] TaskArray)
{
var tasks = new HashSet<Task>(TaskArray);
while (tasks.Any()) tasks.Remove(await Task.WhenAny(tasks));
}
e quindi chiamare in questo modo:
await ReleaseAsync(task1, task2, task3);
//or
await ReleaseAsync(tasks.ToArray());
Tuttavia, di recente Ho notato alcuni comportamenti strani e ho impostato se c'era un problema con il metodo ReleaseAsync. Sono riuscito a ridurlo a questa semplice demo, viene eseguito in linqpad se si include System.Threading.Tasks
. Funzionerà anche leggermente modificato in un'app console o in un controller mvc asp.net.
async void Main()
{
Task[] TaskArray = new Task[]{run()};
var tasks = new HashSet<Task>(TaskArray);
while (tasks.Any<Task>()) tasks.Remove(await Task.WhenAny(tasks));
}
public async Task<int> run()
{
return await Task.Run(() => {
Console.WriteLine("started");
throw new Exception("broke");
Console.WriteLine("complete");
return 5;
});
}
Quello che non capisco è perché l'eccezione non si presenta mai da nessuna parte. Avrei pensato che se i Task con l'eccezione fossero attesi, si sarebbero buttati. Sono stato in grado di confermare questo sostituendo il ciclo while con un semplice per ogni in questo modo:
foreach(var task in TaskArray)
{
await task;//this will throw the exception properly
}
La mia domanda è, perché non Nell'esempio mostrato generare l'eccezione correttamente (che non mostra mai da nessuna parte).
possibile duplicato (http://stackoverflow.com/questions/22856052/how- to-handle-task-factory-startnew-exception) –
Qualsiasi motivo per non utilizzare 'Task.WhenAll'? –
@PauloMorgado - Sì, questi erano legati alle risorse gestite e volevo rilasciarli quando sono diventati disponibili invece di aspettare che tutti li completassero e poi li rilasciassero. –