2010-04-16 3 views
4

Je regarde l'exemple de la gestion des exceptions TPL MSDN @MSDN Exemple de gestion d'une exception du TPL - S'agit-il d'une condition de concurrence?

http://msdn.microsoft.com/en-us/library/dd537614(v=VS.100).aspx

La forme de base du code est:

Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); }); 
try 
{ 
    task1.Wait(); 
} 
catch (AggregateException ae) 
{ 
    throw ae.Flatten(); 
} 

Ma question est: Est-ce une condition de course? Que se passe-t-il si task1 est lancé avant que l'essai ne soit exécuté? Est-ce que je manque quelque chose qui empêche que ce soit une course?

devrait-il pas écrit comme ceci:

try 
{ 
    Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); }); 
    task1.Wait(); 
} 
catch (AggregateException ae) 
{ 
    throw ae.Flatten(); 
} 

Répondre

6

Non, le premier exemple est parfaitement valide.

Lorsque l'exception est déclenchée dans la tâche, elle est enveloppée dans une exception AggregateException. Seulement quand un autre thread rejoint la tâche, dans cet exemple en appelant task1.Wait() est l'exception propagée au thread rejoignant. Essentiellement, l'exception est "stockée" jusqu'à ce qu'elle puisse être renvoyée à un thread qui attend le retour.

Questions connexes