2011-01-12 10 views
0

私はここで直面しているのと同じ状況を見つけることができませんでした。修正閉鎖質問へのアクセス

ここで私が心配程度だ抜粋です:

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

を私には、これは正常に見える、しかしReSharperのは2回目の呼び出しに対して警告を与えている:

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

まだコードの残りの部分をコメントアウトしていますが、まだ警告を出していますので、間違いだと思っています。# – Rob

答えて

4

ResharperはParallel.ForEachがラムダをすぐに実行したことを知らない。このラムダは後で実行され、クロージャが修正され、いくつかの問題が発生する可能性があると仮定します。この警告は無視できます。

2

ReSharperはあなたにどのような警告を与えていますか?静的解析が完璧ではないことを覚えておいて、私はReSharperが間違いを犯している可能性が高いと言います。元のコードは私にはうまく見えます。

+0

「変更されたクロージャへのアクセス」という警告が表示され、 3番目のブロックのコード – Rob

関連する問題