4

おそらく新人エラーですが、何かおかしくなっています。.NET パフォーマンス カウンターをアプリケーションに織り込もうとしています。

平均パフォーマンス カウンターでメソッドを呼び出すincrementBy(value)と、ベース カウンターの RawValue も値によって変更されます。変数名を確認しましたが、すべて正しいと思います。

次にincrement()、ベース カウンターを呼び出すと、avgcounter の rawvalue に 1 が追加され、ベース カウンターがインクリメントされます... 怪我に侮辱を加えます!

他の誰かがこの種の行動を見たことがありますか? 何が起こっているのか、それを修正する方法について何か提案はありますか?

コードでは、2 つの異なるカウンターを使用して、作成したマージ ソートにかかる時間を測定しています。ソートの経過時間の瞬間カウンターと平均カウンターがあります。

Dim timePiece As New Stopwatch()

timePiece.Start()
MergeSort()
timePiece.Stop()

ElapsedCounter.RawValue = timePiece.ElapsedMilliseconds
AvgCounter.IncrementBy(timePiece.ElapsedMilliseconds)
AvgCounterBase.Increment()

私が見ているのは次のとおりです。

'Elapsed counter works as expected  
'AvgCounter RawValue is 7, AvgCounterBase RawValue is also 7 before incrementing
AvgCounter.IncrementBy(value) 'AvgCounter.RV は 7+値、AvgCounterBase は 7+値   
 AvgCounterBase.Increment() 'AvgCounter.RV は 7+value+1、AvgCounterBase は 7+value+1  

カウンターを間違って使用している可能性があると思いますが、平均の raw 値を変更するとベースの raw 値も変更されるように見えるのはなぜですか? 私はそれが起こるはずだとは思わない。

4

1 に答える 1

0

その動作は、それがどのように機能するかです。Increment と IncrementBy は、RawValue を直接変更することで自分でできることの本質的にスレッドセーフなバージョンです。カウンターが単一のスレッドによってのみアクセスされる場合、これらのステートメント:

counterVariable.RawValue++;
counterVariable.RawValue += 2;

次のステートメントと同等です。

counterVariable.Increment();
counterVariable.IncrementBy(2);

複数のスレッドからアクセスされる場合、RawValue を直接変更することはスレッドセーフではなく、更新の一部が失われる可能性があります。

于 2009-07-23T17:13:26.513 に答える