2

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

1 Answer 1

6

The counter variable 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:

throw new Exception(string.Format("number {0} failed on iteration {1}", number4, Interlocked.Increment(ref counter))); 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.