2011-01-12 2 views
0

약간의 검색이 있었지만 여기에 직면 한 것과 같은 상황을 찾을 수 없습니다. 이 그러나 ReSharper에서이 두 번째 통화에 대한 경고를주고, 잘 보이는 나에게수정 된 종결 질문에 대한 액세스

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

: 여기

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 
    } 

그것을 부르고 기능이있다 : 여기

내가 걱정 코드 조각이다 CreateASyncStatsNodes (첫 번째 호출은 괜찮습니다). 그 조언에 따라 , 그것은으로 블록을 회전 : 이것은 정말 나에게 이해가되지 않습니다

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

, 실제로 아무것도를 해결하지 않는 것 (이 경우에도 처음에 파손 된 경우) . resharper가 실수로 경고를 표시하고 있습니까, 아니면 뭔가 빠졌습니까?

+0

사용중인 R # 버전은 무엇입니까? R # 5.0을 사용하여 위의 코드에 대한 경고를 얻지 못했습니다. – adrianbanks

+0

그것은 버전 5.1 – Rob

+0

그냥 나머지는 코드를 주석, 여전히 경고를주고 .. 그래서 나는 그것이 실수로 r에 의해 가정하고있어 # – Rob

답변

4

Resharper는 Parallel.ForEach가 람다를 즉시 전달했다는 것을 모릅니다. 이 람다가 나중에 실행될 수 있다고 가정합니다. 클로저가 수정되어 일부 문제가 발생할 수 있습니다. 이 경고는 무시할 수 있습니다.

2

ReSharper가주는 경고는 무엇입니까? 정적 분석이 완벽하지 않다는 것을 명심하십시오. ReSharper가 실수를 저지르고있을 가능성이 높습니다. 원래 코드는 나에게 잘 어울립니다.

+0

그냥 '변경 폐쇄에 대한 액세스'경고를 제공하고 변경 사항을 수락하면 세 번째 블록의 코드 – Rob