2010-05-13 14 views
19

मेरा ऐप एक तृतीय पक्ष मॉड्यूल का उपयोग करने के लिए मजबूर होना है जो एक ही मशीन पर एक ही समय में दो उदाहरण शुरू होने पर ब्लू-स्क्रीन विंडोज़ होगा। समस्या के समाधान के लिए, मेरी सी # अनुप्रयोग एक म्युटेक्स है:क्रॉस-उपयोगकर्ता सी # म्यूटेक्स

static Mutex mutex = new Mutex(true, "{MyApp_b9d19f99-b83e-4755-9b11-d204dbd6d096}"); 

और मैं जाँच अगर यह मौजूद है - और यदि ऐसा है तो मुझे एक त्रुटि संदेश दिखाने के लिए और ऐप्लिकेशन बंद:

bool IsAnotherInstanceRunning() 
    { 
     if (mutex.WaitOne(TimeSpan.Zero, true)) 
      return (true); 
     else 
      return (false); 
    } 

समस्या है यदि दो उपयोगकर्ता लॉग इन कर सकते हैं और एक ही समय में एप्लिकेशन खोल सकते हैं, और IsAnotherInstanceRunning() झूठी वापसी करेगा।

मैं इसके आसपास कैसे हो सकता हूं?

+1

तृतीय पक्ष मॉड्यूल कैसे करता है? क्या आपने उनके समर्थन से संपर्क किया है? – SLaks

+0

जब तक कि यह कर्नेल-स्तरीय ड्राइवर नहीं है, तब तक इन दिनों विंडोज ब्लू-स्क्रीन बनाने में आश्चर्यजनक रूप से मुश्किल है - दुनिया में क्या मॉड्यूल कर रहा है? –

+0

@ ब्लूराजा: उपयोगकर्ता मोड से ब्लू-स्क्रीन विंडोज़ के लिए यह काफी आसान है। क्या आपने कभी csrss.exe को मारने की कोशिश की? –

उत्तर

30

"ग्लोबल \" के साथ म्यूटेक्स का नाम उपसर्ग करें। http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx से:

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

13

Global\ से शुरू करने के लिए mutex नाम बदलें।

Source

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

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