I want to run async 4-tier nested loop and print all aggregate exception but fail to do so.
Followed MS post on how to handle exception in Parallel library.
Can get why I get always random number while it should print 3^3 times ?
Console.WriteLine("{0} was on counter\n\n\n",counter);
class Program
{
static void Main()
{
int counter = 1;
List<int> numbers = new List<int> {1, 2, 3};
try
{
ConcurrentQueue<Exception> exceptions = new ConcurrentQueue<Exception>();
Parallel.ForEach(numbers, number1 =>
{
Parallel.ForEach(numbers, number2 =>
{
Parallel.ForEach(numbers, number3 =>
{
Parallel.ForEach(numbers, number4 =>
{
try
{
throw new Exception(string.Format("number {0} failed on iteration {1}",number4,counter++));
}
catch (Exception exception)
{
exceptions.Enqueue(exception);
}
});
});
});
});
if (!exceptions.IsEmpty)
{
throw new AggregateException(exceptions);
}
}
catch (Exception exception)
{
Console.WriteLine("{0} was on counter\n\n\n",counter);
GetInnerException(exception);
}
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
public static void GetInnerException(Exception exception)
{
if (exception.GetType().Equals(typeof(AggregateException)))
{
AggregateException aggregateException = (AggregateException)exception;
foreach (Exception innerException in aggregateException.InnerExceptions)
{
GetInnerException(innerException);
}
}
else
{
Console.WriteLine(exception.ToString());
}
}
}
thanks
The
countervariable is not incremented in a thread-safe fashion.As the TPL loops will run in parallel, your counter variable will be incremented from multiple threads. As incrementing an integer variable is not atomic, you’ll need to make this part thread-safe, for example by using a lock or Interlocked.Increment: