2010-08-03 9 views
1

J'ai récemment changé une boucle For Each pour une boucle Parallel.ForEach. Je suis préoccupé par un objet déclaré en dehors de la boucle, mais affecté lors de l'itération dans la boucle. Voici le code simplifié.Parallel.ForEach stockage local

Dim results As ModelResults 
Dim noResultsModel As New List(Of ModelResults) 
Dim lock As New Object 
Parallel.ForEach(_modelEngines, 
    Sub(model) 

    results = model.Execute 

    If results IsNot Nothing Then 

     SyncLock lock 
      noResultsModel.Add(results) 
     End SyncLock 

    End If 

    results = Nothing 

End Sub) 

Existe-t-il une condition de concurrence potentielle avec l'objet de résultats? Est-ce que quelque chose serait différent si je déplaçais la déclaration des résultats dans la boucle for?

Répondre

4

Oui, il y a certainement une condition de course avec la variable déclarée en dehors de la boucle:

Thread 1: results = model.Execute ' results are from Thread1's current modelEngine 
Thread 2: results = model.Execute ' results are from Thread2's current modelEngine 
Thread 2: If results IsNot Nothing Then ' results are from Thread2's current modelEngine 
Thread 1: If results IsNot Nothing Then ' results are from Thread2's current modelEngine(!) 

Il suffit de le déplacer à l'intérieur, je ne vois pas pourquoi vous voulez déclarer en dehors de la boucle de toute façon.

Questions connexes