2009-07-30 11 views
12

ठीक है, इसलिए मैंने अपना सी # एप्लिकेशन बनाया है, इसके लिए एक इंस्टॉलर बनाया है और यह मेरी मशीन पर स्थापित है।किसी एप्लिकेशन के कई उदाहरणों को प्रतिबंधित करें

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

आपकी मदद के लिए धन्यवाद,

उत्तर

9

आम तकनीक इस के लिए एक नामित Mutex बना सकते हैं और आवेदन शुरू पर अपनी उपस्थिति के लिए जाँच करने के लिए है।

this या this देखें।

DDJ से

कोड:

class App : Form 
{ 
    Mutex mutex; 

    App() 
    { 
     Text = "Single Instance!"; 
     mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX"); 
     if (!mutex.WaitOne(0, false)) 
     { 
      mutex.Close(); 
      mutex = null; 
     } 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
      mutex.ReleaseMutex(); 
     base.Dispose(disposing); 
    } 

    static void Main() 
    { 
     App app = new App(); 
     if (app.mutex != null) Application.Run(app); 
     else MessageBox.Show("Instance already running"); 
    } 
} 
+0

कृपया उत्तर में कोड दिखाएं। पहला लिंक मर चुका था, और अन्य अंततः सूट का पालन कर सकते हैं। – nothingisnecessary

0

मैं वातावरण है कि आप में काम कर रहे हैं पता नहीं है, लेकिन के बारे में 'एकल उदाहरण अनुप्रयोगों' को ध्यान में रखने के लिए कुछ आप एकल उदाहरण कैसे परिभाषित है। यदि एक ही समय में एकाधिक वर्कस्टेशन पर एप्लिकेशन चलाया जा सकता है, तो एक सामान्य डेटासोर्स का उपयोग करना, क्या यह एक मुद्दा है? इसी तरह, टर्मिनल-सेवा की स्थिति (या "स्थिति के रूप में चलाएं) के बारे में क्या है, जहां एक से अधिक उपयोगकर्ता एक ही कंप्यूटर में लॉग इन हैं, क्या आप इस एप्लिकेशन को इस तरह से प्रतिबंधित करना चाहते हैं कि प्रति उपयोगकर्ता केवल एक उदाहरण -कंप्यूटर? या क्या आप इसके साथ बस एक उदाहरण होने के साथ ठीक है?

इनका जवाब आपको एक दिशा में एक दिशा में ले जा सकता है। उदाहरण के लिए, हमारे पास कंप्यूटर का समूह होने के दायरे के साथ 'सिंगल-इंस्टेंस' एप्लिकेशन है। वर्कस्टेशन के उस समूह के भीतर केवल एक उपयोगकर्ता की अनुमति है। हमने इसे हमारे साझा डेटा-स्रोत में एक टेबल रखकर प्रबंधित किया जो वर्तमान में जुड़े उपयोगकर्ताओं को ट्रैक करता है। यह एक रखरखाव मुद्दा है क्योंकि आपको यह सुनिश्चित करने की आवश्यकता है कि तालिका हर समय 100% सटीक है। वर्कस्टेशन पर अप्रत्याशित पावर आउटेज जैसी चीज़ों को संभालना, उस तालिका में "बोगस" रिकॉर्ड छोड़कर कुछ सावधानीपूर्वक संभालना पड़ा।

4
Messrs. Allen और Powell करने के लिए धन्यवाद के साथ

:

static void Main() 
    { 
     using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) { 
      if (!mutex.WaitOne(0, false)) { 
       string processName = GetProcessName(); 
       BringOldInstanceToFront(processName); 
      } 
      else { 
       GC.Collect(); 
       Application.Run(new Voting()); 
      } 
     } 
    } 

    private static void BringOldInstanceToFront(string processName) { 
     Process[] RunningProcesses = Process.GetProcessesByName(processName); 
     if (RunningProcesses.Length > 0) { 
      Process runningProcess = RunningProcesses[0]; 
      if (runningProcess != null) { 
       IntPtr mainWindowHandle = runningProcess.MainWindowHandle; 
       NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED); 
      NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE); 
      } 
     } 
    } 
+0

कोड डिस्प्ले @ "ग्लोबल \" द्वारा फेंक दिया जाता है - मेरी माफ़ी। – lance

8

मैं इस

[STAThread] 
static void Main() 
    { 

     Process[] result = Process.GetProcessesByName("ApplicationName"); 
     if (result.Length > 1) 
     { 
      MessageBox.Show("There is already a instance running.", "Information"); 
      System.Environment.Exit(0); 
     } 
     // here normal start 
    } 

यह सरल है इस समस्या का समाधान है, लेकिन मैं शायद ही बेहतर समाधान के लिए जाँच करने के लिए समय नहीं था।

+0

यदि कोई व्यक्ति किसी भिन्न नाम में एप्लिकेशन की प्रतिलिपि लेता है और एक नई प्रक्रिया के रूप में शुरू होता है, तो कई उदाहरण होंगे। तो वर्णन या मूल फ़ाइल नाम जैसे 'processObject.MainModule.FileInfo' फ़ील्ड का उपयोग करें .. जो निष्पादन योग्य फ़ाइल का नाम बदलकर भी परिवर्तित नहीं होता है – Sanjay

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