2010-12-15 14 views
10

मैं सी # के भीतर एक प्रक्रिया को बंद करने की कोशिश कर रहा हूं लेकिन मैं पहले कैसे खोलता हूं यह जांच कैसे करूं? उपयोगकर्ताओं ने इस सुविधा के लिए कहा और उनमें से कुछ अभी भी अन्य प्रक्रिया के बंद बटन का उपयोग कर रहे होंगे।सी # जांचें कि कोई प्रक्रिया मौजूद है या नहीं, तो इसे

तो, अभी ठीक काम करता है: अब

Process.GetProcessesByName("ProcessName")[0].CloseMainWindow(); 

, कैसे मैं पहली बार है कि यह मौजूद है की जाँच करते हैं, यह काम नहीं करता:

if (Process.GetProcessesByName("ProcessName")[0] != null) {...} 

उत्तर

17

GetProcessesByName लिए दौड़ शर्त है जो एक प्रक्रिया पहली कॉल के बाद बंद कर देता है से बचने के लिए इस प्रयास करें जानना चाहेंगे कि यह कोड कभी-कभी असफल हो सकता है।

Process .NET में कक्षा विंडोज प्रदर्शन काउंटर पर आधारित है, जो कुछ मशीनों पर रजिस्ट्री के माध्यम से अक्षम किया जा सकता है। जब ऐसा होता है, तो Process.GetProcessesByName विधि पर कॉल अपवाद फेंक देगा।

मुझे लगता है कि यह स्थिति विभिन्न "साफ-सफाई/प्रदर्शन ट्यूनिंग" अनुप्रयोगों वाली मशीनों के लिए विशिष्ट है, जो अन्य सामानों के साथ, मशीन के प्रदर्शन में अनुमान लगाने के लिए प्रदर्शन काउंटर अक्षम करती हैं।

अतीत में इसने मुझे बार-बार अपने ग्राहकों की क्लाइंट मशीनों के कुछ प्रतिशत के साथ दर्द का कारण बना दिया है, जिसने मुझे अन्य एपीआई (यदि कुछ हद तक सीमित या बोझिल) विकल्पों का पता लगाने का नेतृत्व किया, जैसे कि विन एपीआई को सीधे पिनवोक का उपयोग करने के लिए कॉल करना प्रक्रियाओं।

एक और संभावित समाधान यह सुनिश्चित करना होगा कि आपका इंस्टॉलर या एप्लिकेशन प्रदर्शन काउंटर सक्षम करता है, या कम से कम जानता है कि अक्षम होने के साथ कैसे निपटें।

+0

यह बिल्कुल सही है! धन्यवाद! –

2
Process.GetProcessesByName("ProcessName").FirstOrDefault() != null 
+0

आप जानी धन्यवाद, मैं, एंडी सलाह पसंद करेंगे क्योंकि यह LINQ –

+0

.Any (प्रयोग नहीं करता है) और अधिक समझ –

+0

@Eric ऊपर आप दोस्त के लिए बनाता है :-) –

4

कैसे के बारे में

if (Process.GetProcessesByName("ProcessName").Length > 0) {...} 
+0

हां! आपका बहुत बहुत धन्यवाद! –

+0

खुशी है कि मैं मदद कर सकता हूं। –

+2

मुझे लगता है कि उस एलिप्सिस के अंदर दौड़ की स्थिति छिपी जा सकती है! –

3

आप लूप भी कर सकते हैं, जो काम करता है ne अगर कोई नहीं है। आप मशीनों की एक विस्तृत श्रृंखला पर इस आवेदन को तैनात करने की योजना बना रहे हैं

Process[] processes = Process.GetProcessesByName("ProcessName"); 
if (processes.Length > 0) 
    processes[0].CloseMainWindow(); 
7

, आप:

foreach(Process p in Process.GetProcessesByName("ProcessName")) 
{ 
    p.CloseMainWindow(); 
} 
+1

सलाह देने के लिए धन्यवाद, मैं उस समय की सराहना करता हूं जब आप मुझे बचा रहे हैं। –

+1

इस परियोजना के लिए, मैं केवल अपवाद को पकड़ने में बेहतर होगा। मुझे यकीन है कि कुछ प्रयोगशालाओं में प्रदर्शन काउंटर अक्षम हैं और व्यवस्थापक निर्णयों के साथ गड़बड़ करना अच्छा नहीं होगा। एक बार फिर धन्यवाद। –

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