2010-10-14 11 views
1

J'utilise System.Threading.Tasks.Parallel.For pour effectuer des traitements lourds.Parallèle.Pour la synchronisation avec des objets NULL

Mon code est:

int count = 10; 
List<MyObj> results = new List<MyObj>(); 

Parallel.For(0, count, (index) => 
{ 
    MyObj obj = GetMyObjMaybe(); 

    if (obj != null) 
     results.Add(obj); 
}); 

if (results.Contains(null)) 
{ 
    //break here, and it does 
} 

//sometimes contains null objects 
return results; 
} 

Je ne soupçonniez pas être obtenir nulle dans la liste, mais je suis. Je dois être bâclé l'utilisation de index en quelque sorte. Des idées?

+0

Qu'est-ce que 'c' dans' results.Add (c) '? –

+0

Oui, merci. Fixé. – bufferz

Répondre

6

Votre List<MyObj> results est et non thread-safe.

Vous voyez des valeurs nulles car results peut être invalide de plusieurs façons.

Utilisez un Thread-safe collection class ou protégez chaque accès à results par une instruction lock.

+0

Merci, Henk. Je pensais que la liste serait thread-safe pour l'ajout simultané au moins. Un objet de verrouillage simple a résolu le problème. Merci encore. – bufferz

+0

"Vous pouvez accepter une réponse dans 5 minutes." -ALORS. Je reviendrai: P – bufferz

+0

@bufferz - en général, supposons que les collections ** peuvent être sûres pour la lecture simultanée, mais elles ne sont presque jamais sécurisées pour l'écriture simultanée ou les lectures/écritures mixtes. Ensuite, vérifiez vos hypothèses dans les documents. –