2009-07-23 14 views
3

Wahrscheinlich ein Anfänger Fehler, aber ich bekomme etwas seltsam. Ich versuche, einen .NET-Leistungsindikator in eine Anwendung zu weben.Leistungszähler werden nicht richtig hochgezählt?

Wenn ich die incrementBy(value) Methode auf meinem Avg-Leistungsindikator aufrufen, ändert es auch den RawValue meines Basiszählers nach Wert. Ich überprüfte die Variablennamen und denke, dass alles korrekt ist.

Dann, wenn ich increment() auf meinem Basenzähler anrufe, addiert es 1 zum rowvalue des avgcounter sowie zum Erhöhen des Basiszählers ..., der Beleidigung zur Verletzung hinzufügt!

Hat jemand anderes diese Art von Verhalten gesehen? Irgendwelche Vorschläge für das, was vor sich geht und wie es zu beheben ist?

Im Code verwende ich zwei verschiedene Zähler, um die Zeit zu messen, die ich für die Zusammenführung sortiere. Ich habe einen momentanen Zähler für die verstrichene Zeit der Sorte und einen Durchschnittszähler.

Dim timePiece As New Stopwatch() 

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

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

was ich sehe auftritt:

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

Ich glaube, ich falsch die Zähler verwendet werden kann, aber warum die rawValue des Durchschnitts hat die Änderung scheint auch die rawValue zu ändern von der Basis? Ich denke nicht, dass das passieren soll.

+0

Ich verstehe nicht, was Sie erwarten zu passieren. Könntest du dein Beispiel mit konkreten Werten erklären und was erwartest du nach jeder Aussage? –

+0

Okay, ich habe die Frage bearbeitet. Hoffentlich ist es jetzt klarer. Danke für die Eingabe. – jrsconfitto

+0

hmm ... ich habe das nie erwischt. Aber ich habe meinen Code komplett überarbeitet und das schien mir zu helfen. Ich werde nur dieses eine zu schlechtem Design kreieren, denke ich. – jrsconfitto

Antwort

1

Dieses Verhalten ist, wie es funktionieren sollte. Increment und IncrementBy sind im Wesentlichen threadsichere Versionen dessen, was Sie selbst tun könnten, indem Sie RawValue direkt ändern. Wenn der Zähler nur von einem einzigen Thread diese Aussagen zugegriffen:

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

äquivalent sind zu diesen Aussagen:

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

Wenn von mehreren Threads zugegriffen wird, Modifizieren RawValue nicht direkt ist threadsicher und möglicherweise kann Verliere einige der Updates.

+0

Ich glaube, ich in meiner Frage unklar gewesen sein ... wenn ich rufe: avgcounter.incrementBy (Wert) avgcounterBase.increment() meine Basiszähler um Wert erhöht wird (nach dem Aufruf von avgcounter) und wird dann noch einmal inkrementiert. Gilt Ihre Antwort immer noch mit dieser Klarstellung? – jrsconfitto

Verwandte Themen