2012-02-02 14 views
24

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

मैं प्रोसेस आईडी निर्धारित कर सकता हूं या काउंटर पर प्रक्रिया आईडी को उसी नाम के साथ प्रत्येक प्रक्रिया के परिणाम प्राप्त करने के लिए कैसे पास कर सकता हूं?

PerformanceCounterCPU.CategoryName = "Process"; 
PerformanceCounterCPU.CounterName = "% Processor Time"; 
PerformanceCounterCPU.InstanceName = proc.ProcessHandle.ProcessName; 

PerformanceCounterMemory.CategoryName = "Process"; 
PerformanceCounterMemory.CounterName = "Working Set - Private"; 
PerformanceCounterMemory.InstanceName = proc.ProcessHandle.ProcessName; 
+1

वाह! मैंने 2 साल पहले ** बिल्कुल ** एक ही समस्या का सामना किया है, और मुझे उस समय कोई जवाब नहीं मिला ... अब उत्तर के लिए भी प्रतीक्षा कर रहा है;) – ken2k

+0

धन्यवाद बेन। दुर्भाग्यवश उन समस्याओं को मैंने अतीत में प्रश्न पूछे हैं दुर्लभ हैं और हल नहीं किए गए हैं। मैं उन प्रश्नों के तरीकों का उपयोग करने से दूर बैकिंग समाप्त कर दिया। – JeremyK

+0

केन, नीचे दिए गए उत्तर ने – JeremyK

उत्तर

28

एक संबंधित सवाल का This answer काम कर सकते हैं:

private static string GetProcessInstanceName(int pid) 
{ 
    PerformanceCounterCategory cat = new PerformanceCounterCategory("Process"); 

    string[] instances = cat.GetInstanceNames(); 
    foreach (string instance in instances) 
    { 

    using (PerformanceCounter cnt = new PerformanceCounter("Process", 
      "ID Process", instance, true)) 
    { 
     int val = (int) cnt.RawValue; 
     if (val == pid) 
     { 
      return instance; 
     } 
    } 
    } 
    throw new Exception("Could not find performance counter " + 
     "instance name for current process. This is truly strange ..."); 
} 
+0

बिल्कुल सही। मैंने अतीत में कच्चे मूल्य का उपयोग करने की कोशिश की, हालांकि यह कभी भी पिड से मेल नहीं खा रहा था। यह काम किया है, बहुत बहुत धन्यवाद। – JeremyK

+6

क्रेडिट प्रदान करने के लिए, यह मूल रूप से पुराने इनगो रैमर ब्लॉग से आता है (जिनके लेखों ने मुझे अपने शुरुआती .NET दिनों में बहुत कुछ सिखाया): http://weblogs.thinktecture.com/ingo/2004/06/getting- वर्तमान-प्रक्रिया-your-own-cpu-util.html – TheXenocide

+1

जानना अच्छा है। मैंने उस स्रोत को श्रेय दिया जिसकी मैंने प्रतिलिपि बनाई, यह मेरे लिए पर्याप्त है। –

0

आप एक मशीन चौड़ा रजिस्ट्री परिवर्तन कोई आपत्ति नहीं है, तो आप configure Windows to use the form ProcessName_ProcessID for Perf Counter instance names कर सकते हैं, बल्कि # 1, # 2, आदि जोड़कर से:

DWORD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfProc\Performance\ProcessNameFormat बनाएँ और करने के लिए 2.

अपने मूल्य सेट आप # 1, # 2 आदि फार्म के साथ छड़ी है, तो सावधान रहना कि the instance name for a given process can change during the process' lifetime!

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