Why does the following crash if run inside a console application instead of throwing an AggregateException and being caught by the outer try/catch?
I've simplified the use case for the await for brevity, but in the relevant code I am indeed trying to execute an awaitable Task of importance.
var list = new List<string>() {"Error"};
try
{
Parallel.ForEach(list, new ParallelOptions()
{
MaxDegreeOfParallelism = 8
}, async listEntry =>
{
await Task.Delay(5000);
throw new Exception("Exception");
});
}
catch (Exception ex)
{
//never hits, the application crashes
}
Console.ReadLine();
I note that the following does not cause the application to fail, and an exception is indeed caught, but I do not understand what's really going on as to what is fundamentally different about the two contexts:
var list = new List<string>() {"Error"};
try
{
Parallel.ForEach(list, new ParallelOptions()
{
MaxDegreeOfParallelism = 8
}, listEntry =>
{
throw new Exception("Exception");
});
}
catch (Exception ex)
{
//exception is caught, application continues
}
Console.ReadLine();
Parallel.ForEachto start multiple tasks when you don't care how they end... You may search for "C# fire-and-forget async" if you actually need code similar to one in this post.Parallel.ForEachwithasync/awaitstackoverflow.com/questions/11564506/…await-ing them it is fire-and-forget (broken in the way you see it). If your actual code hasawait- makes sure to update the code. (Note: I thinkTask.Delay(1)is better and more compact way to demonstrate awaitable code thanTask.Run.)