Blogginlägg

Exception från Parallel.ForEach

Av Cecilia Wirén | Blogg | 17 maj 2016

Parallel klassen ingår i det som kallas Task Parallel Library (TPL) och som Microsoft lanserade i .NET Framework 4. I denna ingår även Task klassen och Parallel LINQ (PLINQ) och även dessa berörs av det som beskrivs nedan.


I och med de nya parallella strukturerna i .NET 4 blev det enklare att hantera trådade applikationer. Något som dock fortfarande kan vara lite svårt är felhanteringen men även där har Microsoft tänkt till. Det största problemet för oss är att felet händer inte på huvudtråden utan på någon bakgrundstråd OCH det kan även ske flera fel.


Med ett anrop till Parallel.ForEach, Parallel.For men även Task.Wait och användning av PLINQ körs koden i en eller flera andra trådar, men din huvudtråd inväntar sedan att dessa är klara. Exception kommer därför att fångas på din huvudtråd men pg.a att tex kan hinna ske flera fel samlas alla ihop i en AggregateException. Därför skall du alltid fånga denna Exception och sedan titta på dess InnerExceptions för att få ut exakta felen.

 

try
{
Parallel.ForEach(myCollection, item => {...});
}
catch (AggregateException aEx)
{
foreach (var ie in aEx)
{
//ie is the exception thrown in the other thread
}
}
catch (Exception ex)
{
//default error handling
}

msdn: AggregateException Class

Till inlägget