2009-08-06 16 views
11

सरल प्रश्न: मैं डिफ़ॉल्ट ब्राउज़र का उपयोग कर एक यूआरएल खोलना चाहता हूं, इसलिए मैं सिर्फ Process.Start(url) करता हूं। हालांकि, मैंने देखा कि यह एक आईडीस्पोजेबल ऑब्जेक्ट देता है।क्या मुझे प्रक्रिया का निपटान करना है। स्टार्ट (यूआरएल)?

तो अब मुझे आश्चर्य है कि मुझे इसका निपटान करना है या नहीं? या, उस मामले के लिए, यदि मेरा आवेदन किसी भी तरह से इस प्रक्रिया के लिए ज़िम्मेदार है? इच्छित कार्यक्षमता बस "आग और भूल" है, मैं अपने आवेदन को नई प्रक्रिया के माता-पिता के रूप में नहीं रखना चाहता हूं और इसे इसके साथ बातचीत करने की आवश्यकता नहीं है।

मैंने SO पर कुछ समान लेकिन असंबंधित प्रश्नों को देखा है जो ऐसा लगता है कि बस प्रक्रिया को कॉल करना। यूआरएल पर शुरू करना ठीक है, लेकिन मैं मेमोरी लीक/संसाधन थकावट के मुद्दों को डीबग करने के लिए कुछ कठिन परिश्रम नहीं करना चाहता मेरा कार्यक्रम कार्यक्रम लंबे समय तक मृत ब्राउज़र प्रक्रियाओं के संदर्भ रखता है।

उत्तर

9

क्या आप इसे using खंड में लपेट नहीं सकते थे ताकि यह सुनिश्चित किया जा सके कि जीसी जो कुछ भी करने की ज़रूरत है, यदि आपको इसका निपटान करने की आवश्यकता है? यह अभी भी एक प्रकार की "आग और भूल" की अनुमति देगा लेकिन खराब स्थिति में स्मृति/संसाधनों को छोड़ नहीं देगा।

शायद overkill लेकिन वहाँ IDisposable इंटरफ़ेस के बारे में CodeProject पर एक बहुत अच्छी लेख है: http://www.codeproject.com/KB/dotnet/idisposable.aspx

+0

समस्या यह है कि मैं इस स्थिति में ऑब्जेक्ट जीवन को पूरी तरह से समझ नहीं पा रहा हूं। अगर मैं (प्रोसेस। स्टार्ट (यूआरएल)) का उपयोग कर रहा हूं; तो क्या वह उस बिंदु पर इंतजार करेगा? या यह प्रक्रिया को जल्दी से निपटान करेगा? फिलहाल, इससे व्यवहार में कोई फर्क नहीं पड़ता है, इसलिए मैं _guess_ कि कोई संसाधन नहीं है जो खुले रखा जाता है, लेकिन मुझे यकीन नहीं है और मुझे नहीं पता कि इसे कैसे मापें। –

+0

चूंकि "उपयोग" खंड स्पष्ट रूप से कंपाइलर को एक कोशिश/आखिरकार बनाने और एक निपटान को लागू करने के लिए निर्देश देता है और तथ्य यह है कि वे एक आईडीस्पोज़ेबल ऑब्जेक्ट लौट रहे हैं, मुझे लगता है कि आप ऐसा करने के लिए सुरक्षित होंगे। इसे रद्द नहीं करके आप संसाधनों को बांध सकते हैं। आप एक लूप बनाने का प्रयास कर सकते हैं जो उन्हें बिना किसी डिस्पोजेक्ट के कई यूआरएल खोलता है और देखता है कि क्या आपके संसाधन नियंत्रण से बाहर हैं और क्लॉज का उपयोग करके उन्हें लपेटकर एक और परीक्षण है। चेतावनी है कि उसके बाद बंद करने के लिए आपके पास खिड़कियों का एक गुच्छा होगा। :) – Fooberichu

5

प्रक्रिया शुरू एक देशी कॉल जो एक देशी प्रक्रिया संभाल, जो प्रक्रिया का उदाहरण दिया जाता है कि में संग्रहीत किया जाता देता है । प्रक्रिया में विधियां हैं जो हैंडल का उपयोग करती हैं ताकि आप चीजों को बाहर निकलने की प्रक्रिया की प्रतीक्षा कर सकें, या निष्क्रिय हो जाएं।

प्रक्रिया को निपटाने से संभालती है। मैं जॉन के साथ सहमत हूं, इसे एक प्रयोग खंड में लपेटो।

10

नहीं, आप नहीं करते हैं।

void Main() 
{ 
    Process result = Process.Start("http://www.google.com"); 

    if (result == null) 
    { 
     Console.WriteLine("It returned null"); 
    } 
} 

प्रिंटों

It returned null
Process.Start Method (String) से MSDN पर

(.NET फ्रेमवर्क 4):

निष्पादन योग्य फ़ाइल शुरू करने के लिए का पता एक URL है, तो प्रक्रिया नहीं है शुरू किया और शून्य वापस आ गया है।

(सामान्य में, हालांकि, using बयान सही तरीके से IDisposable वस्तुओं के साथ काम करने के लिए है। WCF clients को छोड़कर।)

+0

यहां तक ​​कि जब ब्राउजर प्रक्रिया ** आईएस ** शुरू हुई, तब भी यह शून्य हो जाती है! – AgentFire

+0

@AgentFire आप हमेशा एक यूआरएल के लिए शून्य प्राप्त करेंगे, चाहे आपके ब्राउज़र को लोड करना है या नहीं। यही बात है - आपको इस विशिष्ट मामले (यूआरएल) में निपटान करने की ज़रूरत नहीं है। – TrueWill

2

@ Fooberichu के जवाब स्थान पर है, लेकिन मुझे लगता है कि यह भी है कि उनका कहना है लायक है आम तौर पर केवल कुछ चीजें "ज़रूरत" को स्पष्ट रूप से निपटाया जा सकता है।

वस्तुओं हमेशा प्रभावी ढंग से पर निपटारा कर रहे हैं कुछ बिंदु:

  • किसी भी समय जीसी एक संग्रह करता है, यह होगा (अंततः) वस्तुओं नहीं रह गया है संदर्भित कर रहे हैं कि के निपटान के। इसलिए यदि आप मैन्युअल रूप से निपटान नहीं करते हैं, तो वस्तु को अभी भी दायरे से बाहर होने के कुछ सेकंड के भीतर निपटान किया जा सकता है।
  • जब आपका आवेदन छोड़ता है, तो इसे आयोजित किए गए सभी संसाधन जारी किए जाते हैं। (हालांकि वस्तुओं को सी #/नेट द्वारा निपटाया नहीं जा सकता है, ओएस आपके प्रक्रिया को पकड़ने के लिए बहुत कुछ वापस दावा करेगा।संसाधन के जीवनकाल आपके आवेदन से परे फैली हुई है, तो ओएस आमतौर पर (मैन्युअल रूप से निपटाने की यह सफाई)

बिंदु या रोजगार के लिए जिम्मेदार है एक 'का उपयोग') है इसलिए सुनिश्चित करने के लिए नहीं है कि संसाधनों जारी किया जाएगा, लेकिन उन्हें जितनी जल्दी हो सके जारी करें।

इन दिनों आप अधिकांश प्रकार के संसाधनों (जैसे स्मृति, फ़ाइल हैंडल, या सिस्टम ब्रश) से बाहर निकलने की संभावना नहीं है। हालांकि, अगर आपको संसाधनों को पूरा करने की आवश्यकता नहीं होती है, तो आपका प्रोग्राम कम कुशल होने की संभावना है, तो आप आवश्यकतानुसार अधिक मेमोरी का उपयोग कर सकते हैं, या शायद अस्थायी रूप से उपयोगी अनुप्रयोगों से अन्य अनुप्रयोगों को अवरुद्ध करके देरी कर सकते हैं। सामान्य, तो, निपटान अच्छा शिष्टाचार, स्वच्छता और अनावश्यक अक्षमता काटने के बारे में है।

ऐसे कुछ मामले हैं जहां संसाधन जारी किए जाने चाहिए (उदाहरण के लिए यदि आप फ़ाइल बंद नहीं करते हैं, तो आप इसे अपने प्रोग्राम या अन्य प्रोग्राम्स में कहीं और से नहीं खोल/स्थानांतरित/हटा सकते हैं; यदि आप उन्हें जारी किए बिना अपने ग्राफिक्स कार्ड पर बनावट को आवंटित रखें, आप वीआरएएम से बाहर हो जाएंगे और कंप्यूटर का प्रदर्शन असफल हो जाएगा), लेकिन सामान्य रूप से, आप इन परिस्थितियों को कभी-कभी सामना करेंगे, और यदि आप सर्वोत्तम प्रथाओं का पालन करते हैं (स्पष्ट रूप से ऑब्जेक्ट्स को डिस्पोजेक्ट करते समय ' अब और आवश्यकता नहीं है), आपको आमतौर पर यह जानने की आवश्यकता नहीं होगी कि ये स्थितियां कब होती हैं क्योंकि आप पहले से ही उनके साथ सही तरीके से व्यवहार कर रहे हैं।

+2

कई मामलों में IDISposable कक्षाओं में फाइनलाइज़र नहीं हैं। यदि वे स्पष्ट रूप से ** निपटाए बिना जीसीएड हैं, तो उनके साथ जुड़े किसी भी अप्रबंधित संसाधनों को लीक कर दिया जाएगा। ढांचे के वर्ग ज्यादातर मामलों में हमें बचाने का अच्छा काम करते हैं, लेकिन सर्वोत्तम अभ्यास हमेशा आईडीस्पोजेबल ऑब्जेक्ट्स का निपटान करना है। यह और डब्ल्यूसीएफ क्लाइंट दो अजीब किनारे के मामले होते हैं। – TrueWill

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