To dlatego, że należy wielokrotnie wywoływać numer NextValue
na tej samej instancji PerformanceCounter
(co najmniej dwa razy). Pierwsze wywołanie zawsze zwraca 0.
Można obejść ten (sort of), wywołując NextValue
dwukrotnie w swojej obsługi zdarzeń Page_Load
tylko przechowywanie wartości zwracanej drugiego naboru:
float cpuUsage = 0.00F;
this.theCPUCounter.NextValue();
cpuUsage = this.theCPUCounter.NextValue();
Powód to pokazuje w QuickWatch debuggera prawdopodobnie dlatego, że jest (niejawnie) wywoływana wiele razy (raz przez program i raz przez debugger dla wartości QuickWatch).
Aktualizacja do „rodzaju” powyżej:
Jak wspominają inni zwykle trzeba spać trochę czasu pomiędzy dwoma połączeniami do obserwowania rzeczywistości różnica w obciążeniu procesora, które prowadzą do „wymierny” różnicy. Spanie przez 1 s zwykle powoduje lewę, ale może nie być wystarczającym opóźnieniem w załadowaniu twojej strony.
Co naprawdę chcesz zrobić, to podać wątek w tle, który wielokrotnie odpytuje ten licznik wydajności, śpiąc kilka sekund pomiędzy. I przechowując gdzieś wynik. Od Twojego Page_Load
lub innych zdarzeń/funkcji zapytaj (ostatnią) wartość. Wszystko z koniecznym zablokowaniem przed wyścigami danych oczywiście. Będzie to tak dokładne, jak można uzyskać w odniesieniu do tego wskaźnika.
Ponieważ oczywiście używasz ASP.NET, musisz zachować ostrożność w przypadku takich wątków w tle. Nie jestem ekspertem ASP.NET, ale zgodnie z this powinno być możliwe, nawet jeśli wątek (i odczyty licznika doskonałości), które zostały zrobione, zostaną poddane recyklingowi, gdy twoja domena aplikacji/aplikacja internetowa jest. Jednak w przypadku tego rodzaju funkcji nie powinno to stanowić problemu.
Głupia uwaga, ale być może jeszcze nie przekroczyłeś instrukcji podczas debugowania, więc nowa wartość nie jest jeszcze przechowywana w zmiennej 'cpuUsage'? – Mr47