2009-03-11 12 views
13

का उपयोग कर एक आवेदन के बारे में उनकी article about preventing multiple instances में बनाम, माइकल Covington इस कोड को प्रस्तुत करता है , क्योंकि इसमें कोई अतिरिक्त संदर्भ नहीं है।GC.KeepAlive

मेरा प्रश्न: म्यूटेक्स को एक ही काम में लपेटकर लपेट जाएगा? यही है, क्या निम्नलिखित जीसी को मेरे नीचे से गलीचा खींचने से रोक देगा?

Mutex m = new System.Threading.Mutex(true, "YourNameHere", out ok); 
try 
{ 
    // do stuff here 
} 
finally 
{ 
    m.Close(); 
} 

और मुझे लगता है यह होगा कि m.Close() वहाँ पर्याप्त होगा:

static void Main()     // args are OK here, of course 
{ 
    bool ok; 
    using (var m = new System.Threading.Mutex(true, "YourNameHere", out ok)) 
    { 
     if (! ok) 
     { 
      MessageBox.Show("Another instance is already running."); 
      return; 
     } 

     Application.Run(new Form1()); // or whatever was there 
    } 
} 

मेरे पेट प्रतिक्रिया का उपयोग कर काम करेंगे, का उपयोग कर के बाद से (होना चाहिए) है के बराबर है जेआईटी कंपाइलर को संकेत देने के लिए कि एक और संदर्भ है, इस प्रकार समय से पहले कचरा संग्रह को रोकता है।

+0

मैं कोई सीएलआर विशेषज्ञ नहीं हूं (यही कारण है कि मैं कोई जवाब नहीं जोड़ रहा हूं) लेकिन ऐसा लगता है कि आप जो कर रहे हैं वह काम करना चाहिए। मैं कहता हूं इसे आज़माएं और देखें। –

+4

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

उत्तर

17

एक using बयान में म्युटेक्स वास्तव में किया जा रहा कचरा एकत्र से रोकेंगे रैपिंग, लेकिन होगा भी से नष्ट (यह Dispose कहता है, नहीं Close) अंत में (जबकि GC.KeepAlive नहीं होगा, जाहिर है)।

यदि विधि का अंत वास्तव में प्रक्रिया का अंत होने जा रहा है, तो मुझे विश्वास नहीं है कि यह आपके द्वारा उपयोग किए जाने वाले किसी भी व्यावहारिक अंतर को करने की संभावना है - मैं using कथन को किसी भी चीज़ का निपटान करने के सामान्य सिद्धांत पर पसंद करता हूं जो IDisposable लागू करता है।

यदि प्रक्रिया समाप्त होने पर म्यूटेक्स का निपटारा नहीं किया गया है, तो मुझे संदेह है कि इसके फाइनलज़र इसका ख्याल रखेंगे - जब तक कि अन्य फ़ाइनलाइज़र अपने टाइमआउट से परे अंतिम रूप से थ्रेड नहीं करते हैं।

यदि फ़ाइनलाइज़र इसका ख्याल नहीं रखता है, तो मुझे नहीं पता कि विंडोज स्वयं ही ध्यान देगा कि प्रक्रिया संभवतः म्यूटेक्स का मालिक नहीं हो सकती है, क्योंकि यह (प्रक्रिया) किसी भी मौजूद नहीं है अधिक। मुझे संदेह है कि यह होगा, लेकिन आपको निश्चित रूप से जानने के लिए विस्तृत Win32 दस्तावेज़ों की जांच करनी होगी।

+1

आप सही हैं, इसे बंद करने के बजाय निपटान कहते हैं, हालांकि इस उदाहरण में यह वही हो जाता है (बंद कॉल निपटान)। एसडीके दस्तावेज कहता है कि म्यूटेक्स प्रोग्राम से बाहर निकलने पर जारी किया जाएगा। आप की तरह, मैं उसी कारण से उपयोग करना पसंद करता हूं। –

+0

मैंने अभी यह प्रश्न देखा है, क्योंकि आवेदन के लिए कॉल। रुन (नया फॉर्म 1()) तब तक वापस नहीं आएगा जब तक कि प्रक्रिया बंद नहीं हो जाती है, इसलिए जीसी.किपलाइव (एम) वास्तव में महत्वपूर्ण नहीं है, क्या मैं सही हूं? – Benny

+4

@ बेनी: हाँ यह है - क्योंकि उस कॉल के बिना, वस्तु कचरा एकत्र किया जा सकता है। तथ्य यह है कि 'जीसी.किपलाइव' के लिए कॉल का अर्थ है कि जीसी को "रूट" संदर्भ के रूप में 'एम' पर विचार करने के लिए मजबूर होना पड़ता है। –

5

using का उपयोग GC.KeepAlive का उपयोग करने से इस मामले में बेहतर फिट प्रतीत होता है। जब तक कि एप्लिकेशन चल रहा है, आप न केवल Mutex जीवित रखना चाहते हैं, आप मुख्य लूप से बाहर निकलने के साथ ही इसे दूर जाना चाहते हैं।

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

-2

मुझे लगता है कि KeepAlive नामित म्यूटेक्स के साथ उपयोग किया जाता है यह सुनिश्चित करना है कि यह कचरा जल्दी नहीं एकत्र किया गया है। सी # का उपयोग/पैटर्न का निपटान उस के खिलाफ सुरक्षित नहीं है। जब किसी ऑब्जेक्ट संदर्भ का उपयोग किसी दायरे में नहीं किया जाता है तो रनटाइम इसे दायरे के अंत से पहले एकत्र कर सकता है। यह एक अनुकूलन है।

+1

<< सी # का उपयोग/निपटान पैटर्न उस के खिलाफ सुरक्षित नहीं है >> क्या आप उस दावे के समर्थन में साक्ष्य प्रदान कर सकते हैं? या तो एक टेस्ट केस, या दस्तावेज? धन्यवाद! – EricLaw