2012-11-26 12 views
11

मैं प्रक्रिया को मारने के लिए Process.Kill() का उपयोग करता हूं।"प्रक्रिया समाप्त हो गई है" अपवाद के बिना प्रक्रिया को कैसे मारें?

if(!process.WaitForExit(5000)) { 
    process.Kill(); 
} 

और कभी कभी प्रक्रिया सही लाइनों के बीच में बंद हो जाएगी, इसलिए नियंत्रण के अंदर if मिल जाएगा और फिर Kill एक अपवाद निकलेगा:

System.InvalidOperationException 
Cannot process request because the process (ProcessIdHere) has exited. 
at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited) 
at System.Diagnostics.Process.Kill() 
//my code here 

अब try- में कोड लपेटकर इस तरह पकड़ एक अच्छा विचार प्रतीत नहीं होता है क्योंकि InvalidOperationException अन्य कारणों से बुलाया जा सकता है।

क्या वर्णित परिदृश्य में अपवाद प्राप्त किए बिना प्रक्रिया को मारने का कोई तरीका है?

+0

क्या आपने आंतरिक अपवाद की जांच करने की कोशिश की है? आपको संभालने के लिए सही अपवाद दे सकता है। – Yahya

+0

@Yahya: हाँ, आंतरिक अपवाद हर समय शून्य है। – sharptooth

उत्तर

9

आप पी/आह्वान TerminateProcess यह Process.Handle गुजर सकता है। फिर मैन्युअल रूप से इसके कारण का मूल्यांकन (GetLastError())। जो मोटे तौर पर है, Process.Kill() आंतरिक रूप से क्या करता है।

लेकिन ध्यान दें कि TerminateProcess असीमित है। तो आपको यह सुनिश्चित करने के लिए प्रक्रिया संभाल पर इंतजार करना होगा कि यह किया गया है। Process.Kill() का उपयोग करना आपके लिए करता है।

अद्यतन: सुधार, Process.Kill() भी एसिंक्रोनस रूप से चलाता है। तो समाप्त होने की प्रतीक्षा करने के लिए आपको WaitForExit() का उपयोग करना होगा - यदि आप परवाह करते हैं।

स्पष्ट रूप से, मैं परेशान नहीं होगा। निस्संदेह हमेशा (रिमोट?) मौका होता है कि कुछ "मनमानी" InvalidOperationExcepion कोड की उस पंक्ति से बाहर बुलबुले होते हैं, जो प्रक्रिया से संबंधित नहीं है या Process ऑब्जेक्ट अमान्य स्थिति में होने के लिए नहीं है, लेकिन इसमें हकीकत मुझे लगता है कि आप Kill के आसपास कोशिश/पकड़ के साथ जा सकते हैं।

इसके अतिरिक्त, आपके आवेदन के आधार पर, आप इस हत्या को लॉगिंग करने पर विचार कर सकते हैं, क्योंकि ऐसा लगता है कि यह अंतिम उपाय उपाय है। उस स्थिति में इसके साथ वास्तविक InvalidOperationException लॉग करें। अगर चीजें अजीब हो जाती हैं, तो कम से कम आपके लॉग इन करें कि Kill विफल क्यों हुआ।

जो कुछ भी कहा गया है, आप भी इसी कारण से Win32Exception को पकड़ने/संभालने पर विचार करना चाहेंगे।

+0

+1 एक समझदार असली दुनिया दृष्टिकोण के लिए +1। – tomfanning

3

आप HasExited उपयोग करने की आवश्यकता:

if(!process.WaitForExit(5000)) 
{ 
    if (!process.HasExited) 
    { 
     process.Kill(); 
    } 
} 

यहाँ देखें:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.hasexited.aspx

+4

कि अभी भी एक दौड़ की स्थिति है। 'HasExited' 'false' वापस कर सकता है, लेकिन उस समय तक' Kill 'निष्पादित हो जाता है, प्रक्रिया समाप्त हो सकती है - जिसके परिणामस्वरूप अभी भी' अवैधऑपरेशन अपवाद 'होता है। –

+1

हम एक नैनोसेकंड के अंशों की बात कर रहे हैं, जो असंभव लगता है, लेकिन यदि ऐसा है तो आप इसे रोक नहीं सकते हैं, तो आप अपवाद को पकड़ सकते हैं। – Lloyd

+0

"नैनोसेकंड के फ्रैक्शंस" ईमानदार होने के लिए एक असाधारण की तरह लगते हैं। आपकी प्रक्रिया का अनुमान लगाया जा सकता है, उदाहरण के लिए, दो कॉलों के बीच, हेक, बॉक्स "दुर्भाग्यपूर्ण क्रम" में बैक अप के बीच भी हाइबरनेट हो सकता है ;-) लेकिन मैं मानता हूं कि अपवाद को पकड़ना एकमात्र "मजबूत" है समाधान - यदि आप परवाह करते हैं। निश्चित रूप से वाईएमएमवी। –

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