2008-11-10 15 views
159

मैं सी # में किसी एप्लिकेशन के लिए कुल मिलाकर कुल CPU उपयोग प्राप्त करना चाहता हूं। मुझे प्रक्रियाओं के गुणों में खोदने के कई तरीके मिले हैं, लेकिन मैं केवल प्रक्रियाओं के सीपीयू उपयोग को चाहता हूं, और आपके जैसे कुल सीपीयू टास्कमेनर में मिलता है।सी # में सीपीयू उपयोग कैसे प्राप्त करें?

मैं यह कैसे कर सकता हूं?

+1

http://stackoverflow.com/questions/4679962/what-is-the-correct-performance-counter-to-get-cpu-and-memory-usage-of-a-process/4680030 # 4680030 – SwDevMan81

उत्तर

167

आप कक्षा System.Diagnostics से कक्षा का उपयोग कर सकते हैं।

प्रारंभ इस तरह:

PerformanceCounter cpuCounter; 
PerformanceCounter ramCounter; 

cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); 
ramCounter = new PerformanceCounter("Memory", "Available MBytes"); 

इस तरह सेवन:

public string getCurrentCpuUsage(){ 
      return cpuCounter.NextValue()+"%"; 
} 

public string getAvailableRAM(){ 
      return ramCounter.NextValue()+"MB"; 
} 
+74

अच्छा - लेकिन वें ई मूल स्रोत यहां से प्रतीत होता है: http://zamov.online.fr/EXHTML/CSharp/CSharp_927308.html –

+15

जो मैंने पाया है उससे मुझे cpuCounter.NextValue() दो बार उपयोग करना पड़ा और उनके बीच मुझे सोना पड़ा (500) –

+0

मैट सही है। यहां तक ​​कि "वापसी" कीवर्ड को भूलने जैसी बग भी शामिल है। –

5

सीएमएस यह सही है, लेकिन यह भी आप दृश्य स्टूडियो में सर्वर एक्सप्लोरर का उपयोग करें और प्रदर्शन काउंटर टैब के साथ चारों ओर खेलने अगर तो आप समझ सकते हैं कि बहुत उपयोगी मेट्रिक्स कैसे प्राप्त करें।

9

आप सीपीयू प्रतिशत जानकारी प्राप्त करने के लिए डब्लूएमआई का उपयोग कर सकते हैं। यदि आपके पास सही अनुमतियां हैं तो आप रिमोट कंप्यूटर में भी लॉग इन कर सकते हैं। आप क्या हासिल कर सकते हैं इसका एक अनुमान प्राप्त करने के लिए http://www.csharphelp.com/archives2/archive334.html पर देखें।

Win32_Process नामस्थान के लिए एमएसडीएन संदर्भ भी उपयोगी हो सकता है।

कोडप्रोजेक्ट उदाहरण How To: (Almost) Everything In WMI via C# भी देखें।

13

यह ठीक है, मुझे मिल गया! आपकी सहायताके लिए धन्यवाद!

यहाँ यह करने के लिए कोड है:

private void button1_Click(object sender, EventArgs e) 
{ 
    selectedServer = "JS000943"; 
    listBox1.Items.Add(GetProcessorIdleTime(selectedServer).ToString()); 
} 

private static int GetProcessorIdleTime(string selectedServer) 
{ 
    try 
    { 
     var searcher = 
      ManagementObjectSearcher 
      (@"\\"+ selectedServer [email protected]"\root\CIMV2", 
       "SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name=\"_Total\""); 

     ManagementObjectCollection collection = searcher.Get(); 
     ManagementObject queryObj = collection.Cast<ManagementObject>().First(); 

     return Convert.ToInt32(queryObj["PercentIdleTime"]); 
    } 
    catch (ManagementException e) 
    { 
     MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); 
    } 
    return -1; 
} 
+1

आप "नया" भूल गए। 'नया प्रबंधन ऑब्जेक्ट खोजकर्ता '... – SepehrM

51

एक छोटी सी से अधिक requsted गया था, लेकिन मैं ट्रैक करने के लिए अतिरिक्त टाइमर कोड का उपयोग करें और चेतावनी यदि CPU उपयोग 1 के एक निरंतर अवधि के लिए 90% या अधिक है मिनट या लंबा

public class Form1 
{ 

    int totalHits = 0; 

    public object getCPUCounter() 
    { 

     PerformanceCounter cpuCounter = new PerformanceCounter(); 
     cpuCounter.CategoryName = "Processor"; 
     cpuCounter.CounterName = "% Processor Time"; 
     cpuCounter.InstanceName = "_Total"; 

        // will always start at 0 
     dynamic firstValue = cpuCounter.NextValue(); 
     System.Threading.Thread.Sleep(1000); 
        // now matches task manager reading 
     dynamic secondValue = cpuCounter.NextValue(); 

     return secondValue; 

    } 


    private void Timer1_Tick(Object sender, EventArgs e) 
    { 
     int cpuPercent = getCPUCounter(); 
     if (cpuPercent >= 90) 
     { 
      totalHits = totalHits + 1; 
      if (totalHits == 60) 
      { 
       Interaction.MsgBox("ALERT 90% usage for 1 minute"); 
       totalHits = 0; 
      }       
     } 
     else 
     { 
      totalHits = 0; 
     } 
     Label1.Text = cpuPercent + " % CPU"; 
     Label2.Text = getRAMCounter() + " RAM Free"; 
     Label3.Text = totalHits + " seconds over 20% usage"; 
    } 
} 
+2

getRAMCounter() कहां है? –

1

इस वर्ग के लिए स्वचालित रूप से चुनाव काउंटर हर 1 सेकंड और भी सुरक्षित थ्रेड है:

public class ProcessorUsage 
{ 
    const float sampleFrequencyMillis = 1000; 

    protected object syncLock = new object(); 
    protected PerformanceCounter counter; 
    protected float lastSample; 
    protected DateTime lastSampleTime; 

    /// <summary> 
    /// 
    /// </summary> 
    public ProcessorUsage() 
    { 
     this.counter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true); 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <returns></returns> 
    public float GetCurrentValue() 
    { 
     if ((DateTime.UtcNow - lastSampleTime).TotalMilliseconds > sampleFrequencyMillis) 
     { 
      lock (syncLock) 
      { 
       if ((DateTime.UtcNow - lastSampleTime).TotalMilliseconds > sampleFrequencyMillis) 
       { 
        lastSample = counter.NextValue(); 
        lastSampleTime = DateTime.UtcNow; 
       } 
      } 
     } 

     return lastSample; 
    } 
} 
+0

'System.DateTime' वास्तव में एक 8 बाइट मान प्रकार है जिसका अर्थ है कि' डेटटाइम 'चर के लिए असाइनमेंट परमाणु नहीं हैं। यह कोड 32 बिट प्लेटफार्मों पर थ्रेड सुरक्षित नहीं है। – andrewjs

18

कुछ समय बिताने के विभिन्न धागे कि बहुत जटिल है कि मैं इस के साथ आया था लग रहा था एक जोड़े से अधिक पढ़ने के बाद। मुझे इसे 8 कोर मशीन के लिए जरूरी था जहां मैं एसक्यूएल सर्वर की निगरानी करना चाहता था। नीचे दिए गए कोड के लिए मैं "sqlservr" में ऐपनाम के रूप में पास हुआ।

private static void RunTest(string appName) 
    { 
     bool done = false; 
     PerformanceCounter total_cpu = new PerformanceCounter("Process", "% Processor Time", "_Total"); 
     PerformanceCounter process_cpu = new PerformanceCounter("Process", "% Processor Time", appName); 
     while (!done) 
     { 
      float t = total_cpu.NextValue(); 
      float p = process_cpu.NextValue(); 
      Console.WriteLine(String.Format("_Total = {0} App = {1} {2}%\n", t, p, p/t * 100)); 
      System.Threading.Thread.Sleep(1000); 
     } 
    } 

ऐसा लगता है कि मेरे 8 कोर सर्वर पर SQL द्वारा उपयोग किए जाने वाले CPU का% सही ढंग से मापता है।

+0

total_cpu प्रदर्शन काउंटर ("प्रोसेसर") होना चाहिए, न कि PerformanceCounter ("प्रक्रिया") .. अन्यथा आपको केवल 100% * कोर प्राप्त करें। –

2

मुझे PerformanceCounter समाधानों में 1 सेकंड स्टॉल में जोड़ने की इच्छा नहीं थी। इसके बजाय मैंने WMI समाधान का उपयोग करना चुना। PerformanceCounter का उपयोग करते समय रीडिंग सटीक होने की अनुमति देने के कारण 1 सेकंड प्रतीक्षा/स्टाल मौजूद है। हालांकि यदि आप इस विधि को अक्सर कॉल करते हैं और इस जानकारी को ताज़ा करते हैं, तो मैं सलाह देता हूं कि उसे उस देरी को लगातार न लेना पड़े ... भले ही इसे प्राप्त करने के लिए एसिंक प्रक्रिया करने की सोच हो।

मैं यहाँ Returning CPU usage in WMI using C# से स्निपेट के साथ शुरू कर दिया और नीचे मेरी ब्लॉग पोस्ट पर समाधान की पूरी जानकारी के कहा:

Get CPU Usage Across All Cores In C# Using WMI

+1

ग्रेट समाधान, और महान ब्लॉग प्रविष्टि! –

3

यह एक उदाहरण के प्रोसेसर पर पहुंचती है जब तक प्रतीक्षा करने के लिए मेरे लिए काम करने लगता है एक निश्चित प्रतिशत

var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); 
int usage = (int) cpuCounter.NextValue(); 
while (usage == 0 || usage > 80) 
{ 
    Thread.Sleep(250); 
    usage = (int)cpuCounter.NextValue(); 
} 
+0

उपयोग 0 होने पर आप क्यों सो रहे हैं? – watashiSHUN

संबंधित मुद्दे