[英]get current CPU utilization in C#
我想在項目中擁有當前的CPU使用率
namespace Monitoring_Tool
{
public partial class ajaxExecute : System.Web.UI.Page
{
private PerformanceCounter theCPUCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
private PerformanceCounter theMemCounter = new PerformanceCounter("Memory", "Available MBytes");
protected void Page_Load(object sender, EventArgs e)
{
float cpuUsage = 0.00F;
cpuUsage = this.theCPUCounter.NextValue();
}
}
}
當我調試項目時, cpuUsage
的值顯示為0.00
但是當我對此執行QuickWatch
時this.theCPUCounter.NextValue();
它顯示20.6786852
。
為什么不能將其存儲在變量中?
那是因為您需要在同一個PerformanceCounter
實例上多次調用NextValue
(至少兩次)。 第一次通話將始終返回0。
您可以通過在Page_Load
事件處理程序中兩次調用NextValue
來解決此問題,僅存儲第二個調用的返回值:
float cpuUsage = 0.00F;
this.theCPUCounter.NextValue();
cpuUsage = this.theCPUCounter.NextValue();
它在調試器的QuickWatch中顯示的原因可能是因為它(隱式)多次調用(由程序調用一次,由調試器調用一次,以獲取QuickWatch值)。
更新到上面的“排序”:
正如其他人提到的那樣,您通常需要在兩次調用之間睡眠一些時間,才能真正觀察到CPU負載的差異,從而導致“可衡量的”差異。 睡眠1 s通常可以解決問題,但在頁面加載過程中可能無法接受。
您真正想做的是提供一個后台線程,該線程重復查詢該性能計數器,並在此之間休眠幾秒鍾。 並將結果存儲在某個地方。 從您的Page_Load
或其他事件/函數中查詢(最后一個)值。 當然,所有這些都需要針對數據爭用進行必要的鎖定。 關於該指針,它將盡可能准確。
由於您顯然正在使用ASP.NET,因此必須小心使用此類后台線程。 我不是ASP.NET專家,但根據這應該是可能的,即使線(和性能計數器讀數它確實)將被回收,當你的應用程序域/ Web應用程序。 但是,對於這種功能不應該成為問題。
它是一個性能計數器,在很大程度上取決於您何時閱讀它。 處理器核心要么正在執行代碼,要么以“ 100%”全速運行。 或者完全關閉,由HALT指令停止。 “%Processor Time”計數器告訴您自從上次檢查以來 ,有多少時間在執行代碼。
因此,只有在采樣之間等待足夠長的時間,您才會獲得有意義的值。 一秒鍾就是樣板,這就是您在Perfmon.exe和Taskmgr.exe中看到的。 時間間隔越短,數字獲得的准確性越低。 它開始發生巨大變化,在0到100%之間跳躍。
因此,在頁面的Load事件中獲得0%是正常的,它只是初始化計數器以設置間隔的開始。 獲取下一個示例很困難,您實際上不能在事件處理程序中執行此操作。 您必須做一些大膽的事情,例如使用一個單獨的計時器或線程以一秒鍾的間隔進行采樣並使用該值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.