2011-02-23 12 views
7

में प्रक्रिया के बारे में चिंता करने की ज़रूरत है, यहां कोड का टुकड़ा है, जो सभी प्रक्रियाओं के माध्यम से चलता है और जब इसे सही प्रक्रिया मिलती है, तो कोड संदेश भेजता है। मेरा सवाल यह है कि 'proc' के साथ क्या हुआ, उस प्रक्रिया को कैसे निपटाना है।क्या मुझे फ़ोरैच लूप

//get all other (possible) running instances 
     Process[] processes = Process.GetProcesses();    
     foreach (Process proc in processes) 
     { 
      if (proc.ProcessName.ToLower() == ProcessName.ToLower()) 
      { 
       SendMessage(proc.MainWindowHandle, (uint)Message, IntPtr.Zero, IntPtr.Zero); 
      }    
     } 

अग्रिम धन्यवाद, हर्ष

+0

न हो डर :) –

+0

जीसी आपकी सहायता करने के लिए आ जाएगा! – Joe

+1

आप 'समान' विधि के साथ केस असंवेदनशील स्ट्रिंग तुलना के बारे में स्पष्ट हो सकते हैं: 'अगर (proc.ProcessName.Equals (ProcessName, StringComparison.OrdinalIgnoreCase)) ' –

उत्तर

5

सामान्य शब्दों आप निपटान या वस्तुओं deallocating बारे में चिंता करने की जरूरत नहीं है में, जब तक वस्तु IDisposable इंटरफ़ेस लागू करता है। यह आप या तो स्वयं उस पर Dispose() विधि कॉल चाहिए जब आप समाप्त कर लें, या एक using बयान के साथ रैप यह स्वचालित रूप से कहा जाता है करने के लिए करता है:

using (var disposableObject = new DisposableType()) 
{ 
    // do work with disposableObject 
} 
+0

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

+0

'उपयोग' कथन इस मामले में थोड़ी मदद की है क्योंकि 'GetProcesses' सभी तत्कालता करता है। – Groo

+1

@ मासिफ़: प्रक्रिया ऑब्जेक्ट को डिस्पोज़ करना प्रक्रिया को बंद नहीं करेगा, लेकिन केवल आपके हैंडल को ही। जब तक जीसी आपकी प्रक्रिया वस्तु एकत्र नहीं करेगा तब तक हैंडल का निपटान करने के लिए गुम अप्रबंधित संसाधनों को बर्बाद कर देगा। – eFloh

-1

.नेट फ्रेमवर्क के लिए उस पर छोड़ दें। आप परेशान नहीं की जरूरत के बारे में यह

+2

-1। System.Diagnostics.Process System.ComponentModel.Component विरासत में आता है, और इसलिए IDISposable लागू करता है। IDISposable को लागू करने वाली सभी वस्तुओं का निपटान किया जाना चाहिए, या तो 'उपयोग' या निपटान() को सीधे कॉल करना। – erikkallen

+1

और बीटीडब्ल्यू, प्रक्रिया। प्रदर्शन कुछ दिलचस्प करता है। – erikkallen

-1

अगर आप अपने जीता प्रक्रिया को खोजने के लिए पाशन कर रहे हैं तो आप की तरह कुछ की कोशिश कर सकते: मैं यह करने के लिए बदल जाएगा किसी भी मामले में

Process.GetCurrentProcess(); 

:

foreach (Process proc in Process.GetProcesses()) 
    { 
     if (proc.ProcessName.ToLower() == ProcessName.ToLower()) 
     { 
      SendMessage(proc.MainWindowHandle, (uint)Message, IntPtr.Zero, IntPtr.Zero); 
     }    
    } 

कि जिस तरह से कोई वैरिएबल "गेटप्रोसेस" को दोबारा नहीं करेगा और जीसी अंततः इसे संभाल लेगा।

+0

यह जीसी चलाए जाने तक संसाधनों को लॉक कर देगा। – eFloh

-2

परिवर्तनीय proc फोरच लूप के लिए स्थानीय है, इसलिए लूप पूरा हो जाने पर, यह स्वचालित रूप से कचरा एकत्र हो जाएगा।

+0

संसाधनों को लटकने में सहायता नहीं करेगा जब तक कि जीसी – eFloh

5

यह सुनिश्चित करने के लिए कि सभी रेज्यूसर जितनी जल्दी हो सके मुक्त हो जाएं, प्रक्रिया पर निपटें, जब आपको इसकी आवश्यकता नहीं है।

//get all other (possible) running instances 
Process[] processes = Process.GetProcesses(); 
try 
{ 
    foreach (Process proc in processes) 
    { 
    // use proc 
    } 
} 
finally 
{ 
    foreach (Process proc in processes) 
     proc.Dispose(); 
    processes = null; 
} 
संबंधित मुद्दे