2011-01-12 4 views
0

J'ai eu un peu de recherche, mais je ne pouvais pas trouver la même situation que je suis confronté ici.Accès à la question de fermeture modifiée

est ici l'extrait que je suis inquiet:

var threadsafeVacantStats = new Dictionary<Thread, StatsNode>(); 
    var threadSafeVacantLocker = new Object(); 
    var threadsafeZoneStats = new Dictionary<Thread, StatsNode>(); 
    var threadSafeZoneLocker = new Object(); 
    Parallel.ForEach(m_TeamAreasByZone[zone.ContainerID], team => 
    { 
     var tempVacantStatNode = CreateASyncStatsNodes(threadSafeVacantLocker, threadsafeVacantStats); 
     var tempZoneStatNode = CreateASyncStatsNodes(threadSafeZoneLocker, threadsafeZoneStats); 
     //...other stuff 
    } 

est ici la fonction qu'il appelle:

private static StatsNode CreateASyncStatsNodes(object threadSafeLocker, Dictionary<Thread, StatsNode> threadsafeTeamStats) 
{ 
    StatsNode tempStatsNode; 
    var currentThread = Thread.CurrentThread; 
    lock (threadSafeLocker) 
    { 
     if (!threadsafeTeamStats.ContainsKey(currentThread)) 
      threadsafeTeamStats[currentThread] = new StatsNode(0, 0); 

     tempStatsNode = threadsafeTeamStats[currentThread]; 
    } 
    return tempStatsNode; 
} 

Pour moi, cela semble bien, cependant ReSharper donne un avertissement pour le second appel à CreateASyncStatsNodes (le premier appel est bien). Après son avis, il transforme le bloc en:

var threadsafeVacantStats = new Dictionary<Thread, StatsNode>(); 
var threadSafeVacantLocker = new Object(); 
var threadsafeZoneStats = new Dictionary<Thread, StatsNode>(); 
var threadSafeZoneLocker = new Object(); 
object locker = threadSafeZoneLocker; 
Dictionary<Thread, StatsNode> stats = threadsafeZoneStats; 
Parallel.ForEach(m_TeamAreasByZone[zone.ContainerID], team => 
    { 
     var tempVacantStatNode = CreateASyncStatsNodes(threadSafeVacantLocker, threadsafeVacantStats); 
     var tempZoneStatNode = CreateASyncStatsNodes(locker, stats); 
     //... 
    } 

Cela ne me fait pas vraiment de sens, et ne semble pas vraiment fixer quoi que ce soit (si elle a même été cassé en premier lieu) . Resharper est-il en train de marquer par erreur un avertissement ou est-ce que je manque quelque chose?

+0

Quelle version de R # utilisez-vous? Je ne reçois pas l'avertissement pour le code ci-dessus en utilisant R # 5.0. – adrianbanks

+0

Il est la version 5.1 – Rob

+0

Juste commenté le reste du code, toujours donner l'avertissement .. donc je suppose que c'est une erreur par r # – Rob

Répondre

4

Resharper ne sait pas que Parallel.ForEach execute passé lambda immédiatement. Il suppose que ce lambda pourrait être exécuté plus tard, quand la fermeture sera modifiée et cela pourrait causer quelques problèmes. Vous pouvez ignorer cet avertissement.

2

Quel est exactement l'avertissement que ReSharper vous donne? Gardez à l'esprit que l'analyse statique n'est pas parfaite, je dirais qu'il est très probable que ReSharper commette une erreur. Le code original me va bien.

+0

Juste donne l'avertissement 'Accès à la fermeture modifiée', et en acceptant ses changements produit le code dans le troisième bloc – Rob

Questions connexes