2011-01-12 17 views
0

Hatte ein bisschen eine Suche, konnte aber nicht die gleiche Situation finden, die ich hier vorstelle.Zugriff auf modifizierte Schließung Frage

Hier ist das Snippet Ich mache mir Sorgen um:

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 
    } 

Hier ist die Funktion, die sie ruft:

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; 
} 

Für mich ist diese gut aussieht, ist jedoch resharper eine Warnung für den zweiten Anruf zu geben zu CreateASyncStatsNodes (der erste Aufruf ist in Ordnung). seine Ratschläge Nach stellt sich den Block in:

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); 
     //... 
    } 

Das ist nicht wirklich Sinn für mich macht, und scheint nicht wirklich irgendetwas zu beheben (wenn es auch in erster Linie gebrochen wurde) . Schärft der Nachschärfer irrtümlicherweise die Warnung, oder fehlt mir etwas?

+0

Welche Version von R # verwenden Sie? Ich erhalte die Warnung für den obigen Code nicht mit R # 5.0. – adrianbanks

+0

Es ist Version 5.1 – Rob

+0

Nur auskommentiert den Rest des Codes, immer noch die Warnung .. so nehme ich an, es ist ein Fehler von r # – Rob

Antwort

4

Resharper weiß nicht, dass Parallel.ForEach das übergebene Lambda sofort ausführt. Es wird angenommen, dass dieses Lambda später ausgeführt werden könnte, wenn die Schließung geändert wird, was zu einigen Problemen führen könnte. Sie können diese Warnung ignorieren.

2

Genau welche Warnung gibt Ihnen ReSharper? Denken Sie daran, statische Analyse ist nicht perfekt, ich würde sagen, es ist sehr wahrscheinlich, dass ReSharper einen Fehler macht. Der Originalcode sieht für mich gut aus.

+0

Gibt nur die Warnung "Zugriff auf modifizierte Schließung", und wenn es akzeptiert Änderungen ist die produziert Code im dritten Block – Rob

Verwandte Themen