2009-04-22 11 views
8

मेरे पास एक .NET एप्लिकेशन है जिसे मैं केवल एक ही प्रक्रिया को चलाने की अनुमति देता हूं, हालांकि उस समय ऐप का उपयोग सिट्रिक्स बॉक्स पर समय-समय पर किया जाता है, और इसी तरह, उसी मशीन पर एकाधिक उपयोगकर्ताओं द्वारा चलाया जा सकता है।मैं प्रति उपयोगकर्ता सत्र की चल रही प्रक्रिया की जांच कैसे कर सकता हूं?

मैं यह जांचना और सुनिश्चित करना चाहता हूं कि एप्लिकेशन प्रति उपयोगकर्ता सत्र में केवल एक बार चल रहा है, क्योंकि अभी उपयोगकर्ता ए ऐप चला रहा है, तो उपयोगकर्ता बी को "ऐप पहले से उपयोग में" संदेश मिलता है, और नहीं होना चाहिए।

Process[] p = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName); 
      if (p.Length > 1) 
      { 
#if !DEBUG 
       allowedToOpen &= false; 
       errorMessage += 
        string.Format("{0} is already running.{1}", Constants.AssemblyTitle, Environment.NewLine); 
#endif 
      } 

उत्तर

6

संपादित करें: बेहतर जवाब अनुसार this cw question करने के लिए ...

आप मौसम की जाँच के लिए एक म्युटेक्स उपयोग कर सकते हैं

यह वही है मैं अब है कि चल रहा है प्रक्रिया के लिए चेक है ऐप पहले से चलाता है:

using(var mutex = new Mutex(false, AppGuid)) 
{ 
    try 
    { 
     try 
     { 
      if(!mutex.WaitOne(0, false)) 
      { 
       MessageBox.Show("Another instance is already running."); 
       return; 
      } 
     } 
     catch(AbandonedMutexException) 
     { 
      // Log the fact the mutex was abandoned in another process, 
      // it will still get aquired 
     } 

     Application.Run(new Form1()); 
    } 
    finally 
    { 
     mutex.ReleaseMutex(); 
    } 
} 

महत्वपूर्ण AppGuid है - आप इसे उपयोगकर्ता पर निर्भर कर सकते हैं। the misunderstood mutex

+0

काम करता है। धन्यवाद! – Russ

3

tanascius पहले से ही कहते हैं कि रूप में, आप Mutex उपयोग कर सकते हैं:

हो सकता है कि आप इस लेख को पढ़ने के लिए पसंद है।

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

स्रोत: msdn, Mutex Class

0

Form1 गैर पृष्ठभूमि धागे की शुरूआत है, और है कि Form1 बाहर निकल जाता है, आप एक समस्या है: म्युटेक्स जारी की है लेकिन इस प्रक्रिया अभी भी वहाँ है।

static class Program { 
    private static Mutex mutex; 



    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() { 
     bool createdNew = true; 
     mutex = new Mutex(true, @"Global\Test", out createdNew); 
     if (createdNew) { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1());   
     } 
     else { 
      MessageBox.Show(
       "Application is already running", 
       "Error", 
       MessageBoxButtons.OK, 
       MessageBoxIcon.Error 
      ); 
     } 
    } 
} 

म्युटेक्स जब तक प्राथमिक आवेदन डोमेन अभी भी है के रूप में जारी नहीं किया जाएगा: नीचे पंक्तियों के साथ कुछ बेहतर IMHO है। और यह तब तक होगा जब तक एप्लिकेशन चल रहा है।

0

बस स्पष्ट करते हुए कहा - हालांकि Mutex आमतौर पर बेहतर समाधान माना जाता है, तब भी आप Mutex बिना एकल उदाहरण-प्रति-सत्र मुद्दे को हल कर सकते हैं - बस SessionId परीक्षण के रूप में अच्छी तरह से।

private static bool ApplicationIsAlreadyRunning() 
    { 
     var currentProcess = Process.GetCurrentProcess(); 
     var processes = Process.GetProcessesByName(currentProcess.ProcessName); 

     // test if there's another process running in current session. 
     var intTotalRunningInCurrentSession = processes.Count(prc => prc.SessionId == currentProcess.SessionId); 

     return intTotalRunningInCurrentSession > 1; 
    } 
मेरे लिए

Source (no Linq)

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