C # में CPU का उपयोग कैसे करें?


204

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

मैं उसको कैसे करू?



36
पृथ्वी पर यह कैसा विषय है? हास्यास्पद।
पीटर मूर

जवाबों:


205

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

इस तरह शुरू करें:

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";
} 

80
अच्छा - लेकिन मूल स्रोत यहाँ से प्रतीत होता है: zamov.online.fr/EXHTML/CSharp/CSharp_927308.html
मैट रेफ़गी

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

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

8
हाँ, यह उस लिंक से कॉपी की तरह दिखता है, इसलिए मूल के संदर्भ के लिए एक लिंक अच्छी शैली होती। दूसरी तरफ, इसका जवाब देने में CMS का भी अच्छा है ताकि आलसी डेवलपर्स को एक ही जवाब खोजने के लिए पूरे Google पर न खोजनी पड़े। : ओ)
बर्गग्रीनडीके

13
आपको दो बार कॉल करना होगा .NextValue दो बार, एक System.Threading.Thread.Sleep कॉल के साथ इन-बीच (1000ms पर्याप्त होना चाहिए)। यह क्यों आवश्यक है, इसकी अधिक जानकारी के लिए ब्लॉगs.msdn.com/b/bclteam/archive/2006/06/02/618156.aspx देखें , लेकिन उच्च स्तर का सारांश यह है कि मूल्य की गणना करने के लिए आपको दो नमूनों की आवश्यकता है, और आपको इन दोनों को प्राप्त करने के लिए ओएस को एक समय देने की आवश्यकता है।
१०:४

63

सीपीयू के 90% या उससे अधिक होने पर 1 मिनट या उससे अधिक समय तक ट्रैक करने और अलर्ट करने के लिए अतिरिक्त टाइमर कोड की तुलना में थोड़ा अधिक था लेकिन मैं अतिरिक्त टाइमर कोड का उपयोग करता हूं।

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 = (int)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";
    }
}

7
GetRAMCounter () कहाँ है?
डायटर बी

1
cpuCounter.NextValueएक रिटर्नfloat । तो क्यों इसे करने के लिए असाइन करें dynamic? तो फिर क्यों dynamicएक के रूप में वापसी object? तो फिर क्यों एक आवंटित करने के लिए कोशिश objectएक करने के लिए intलाइन में int cpuPercent = getCPUCounter()? (कोड संकलन यही नहीं।)
Wyck

21

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

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 के% को मापने के लिए लगता है।


Total_cpu को PerformanceCounter ("प्रोसेसर") होना चाहिए, PerformanceCounter ("प्रक्रिया") नहीं होना चाहिए .. अन्यथा आपको केवल 100% * कोर की संख्या प्राप्त होगी।
स्टेप कुक कुक

3
आप कहाँ doneतक सही करते हैं? जब तक मैंने कुछ अनदेखी नहीं की है, यह एक अंतहीन लूप प्रतीत होता है:while(!done){...}
मैनफ्रेड

@ मेनफ्रेड यह वास्तव में एक अंतहीन लूप है
जेनी

16

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

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

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 = new
           ManagementObjectSearcher
             (@"\\"+ selectedServer +@"\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;
}

चर चयनित के बजाय सर्वर नाम जोड़ना बेहतर था। like.string computername = environment.GetEnvironmentVariable ("कम्प्यूट्यूटनाम");
डेव

9

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

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

एक कोडप्रोजेक्ट उदाहरण भी देखें : कैसे (लगभग) सब कुछ WMI में C # के माध्यम से


5

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


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 हो तो आप क्यों सो रहे हैं?
वाटशिशु

2

यह वर्ग हर 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;
    }
}

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

1

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

मैंने यहाँ से स्निपेट की शुरुआत की , WMI में CPU उपयोग को C # का उपयोग करके लौटाया और अपने ब्लॉग पोस्ट पर समाधान का पूरा विवरण जोड़ा:

WMI का उपयोग करके C # में सभी करोड़ों के बीच CPU उपयोग प्राप्त करें


कृपया अपने ब्लॉग से लिंक करने के बजाय यहाँ उत्तर को शामिल करें।
हरमन

@ हर्मन - मैंने सिर्फ अपने ब्लॉग से लिंक नहीं किया; मैंने 1 स्पष्टीकरण दिया, और यहां पोस्ट से परे एक गहन उत्तर के लिए एक लिंक प्रदान करने के लिए आगे बढ़ा।
atconway

आपके ब्लॉग पोस्ट में समाधान कोड की 12 लाइनों की तरह है। अपने ब्लॉग पर जाने के लिए लोगों को पाने की कोशिश करने के अलावा अपने उत्तर में इसे शामिल क्यों नहीं करें?
हरमन

@ हर्मन - लिंक पर क्लिक करने में क्या समस्या है क्योंकि इसमें गहराई से स्पष्टीकरण है; यह विचार 'क्यों' भाग विस्तार है? यह भी 7 साल पुराना है, बस कह रही है। इस सटीक पोस्ट को याद करने के लिए कठिन है और मुझे एसओ की पीठ पर एक नयापन है।
atconway

लिंक टूट सकता है, और कोर सामग्री इनलाइन होने पर उत्तरों को स्कैन करना बहुत आसान है। मेरे अन्य उत्तर में कठोर होने के लिए क्षमा करें, मैं आपको कठिन समय देने के लिए नहीं हूं। :)
हरमन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.