2011-04-28 32 views
2

我遇到問題,列出了C#中進程的內存和CPU使用情況。當我嘗試獲取TotalProcessorTime時,出現運行時錯誤「訪問被拒絕」。使用進程類別列出進程內存和CPU使用情況時出現問題#

此外,當我使用PeakWorkingSet64,我得到不合理的數字。例如,我知道steam.exe沒有佔用135380992 KB。

有沒有更好的方法來獲得內存使用?我的目標是像1024K的任務管理器一樣顯示它。

至於CPU使用率,我試着在管理員權限下運行我的編譯器(VS2010 Professional),並且我在管理員帳戶上,但是我得到了同樣的錯誤。此外,我運行Windows 32位,如果這與事情有關。謝謝!

var processes = Process.GetProcesses(); 
listBox1.Items.Clear(); 
foreach (var process in processes) 
{     
    listBox2.Items.Add(process.PeakWorkingSet64 + process.ProcessName + ""); 
    listBox3.Items.Add(process.TotalProcessorTime + ""); 
} 

回答

3

Process.PeakWorkingSet64返回字節不是KB的數量,從而可能會是132203KB或​​129MB這聽上去更合理?

您是否嘗試過在VS之外運行應用程序,以管理員身份運行它?可能VS宿主進程沒有在提升的特權下運行,因此阻止你調用TotalProcessorTime,我沒有測試過,所以我可能在這裏偏離軌道。

更新:我剛做了一個快速測試,似乎TotalProcessorTime屬性實際上試圖打開進程的句柄,即使對於管理員,您可能沒有足夠的權限來執行某些進程。我建議你看看使用windows PerformanceCounter來獲得你正在尋找的信息。

+0

你是正確的字節不是KB,我轉換它,它幾乎是完美的。謝謝!處理器問題仍然存在,當我從release/debug文件夾運行它時,我得到了一個不需要處理的異常。 :*( – llk 2011-04-28 20:28:25

+0

@Shadowalker,我做了一個快速測試,並用信息更新了我的答案, – 2011-04-28 20:33:10

+0

是的,我認爲你是對的,我會瞄準在這一臺上使用一個性能計數器,謝謝! – llk 2011-04-28 20:43:04

4

大部分讀數通常以字節爲單位,而不是KB。另外,由於權限和特權方面的問題,直接使用Process類很困難。嘗試閱讀性能計數器數據。下面是轉儲各種進程的內存使用情況統計信息對所有進程(它使用log4net用於日誌記錄)的樣本函數:

public static void LogProcessMemoryUsage() 
{ 
    try 
    { 
     PerformanceCounterCategory cat = new PerformanceCounterCategory("Process"); 

     string[] instanceNames = cat.GetInstanceNames(); 

     foreach (string name in instanceNames) 
     { 
      try 
      { 
       PerformanceCounter counter = new PerformanceCounter("Process", "Private Bytes", name, true); 
       PerformanceCounter setCounter = new PerformanceCounter("Process", "Working Set", name, true); 
       PerformanceCounter poolNPCounter = new PerformanceCounter("Process", "Pool Nonpaged Bytes", name, true); 

       log.InfoFormat("Memory usage for process [{0}]", name); 
       log.InfoFormat("\tMem Usage:  {0} KB", (setCounter.NextValue()/1024f)); 
       log.InfoFormat("\tVM Size:   {0} KB", (counter.NextValue()/1024f)); 
       log.InfoFormat("\tNon-Paged Pool: {0} KB", (poolNPCounter.NextValue()/1024f)); 
      } 
      catch (Exception ex) 
      { 
       log.InfoFormat("Could not read memory stats for process {0}", name); 
      } 
     } 
    } 
    catch(Exception ex2) 
    { 
     log.Info("Cannot retrieve memory performance counter statistics"); 
    } 
} 
+0

你的答案也很好,我不知道如何使用log4net,所以我只是讓控制檯打印出了很好的信息!我希望我能接受兩個答案。謝謝 :) – llk 2011-04-28 21:13:27

0

運行的應用程序作爲管理員模式,所以它不會說任何關於訪問被拒絕的消息。

如果您正在使用visual studio,然後以管理員模式打開visual studio。 或以管理員模式運行程序。