سؤال

حسنا، حتى لقد خلق بلدي ج # التطبيق، إنشاء المثبت لذلك، وأنها تعمل المثبتة على الجهاز الخاص بي.

والمشكلة هي، عندما يفتح المستخدم إكس تطبيق مرتين، سيكون هناك مثيلين من تطبيق قيد التشغيل. أنا فقط أريد من أي وقت مضى مثيل واحد من التطبيق لتكون قيد التشغيل في أي وقت، وكيف أذهب عن القيام بذلك؟

وشكرا لمساعدتكم،

هل كانت مفيدة؟

المحلول

وتقنية مشتركة لهذا هو خلق Mutex اسمه والتحقق من وجودها على بدء التطبيق.

هذا أو <وأ href = "http://www.codeproject.com /KB/cs/CSSIApp.aspx "يختلط =" نوفولو noreferrer "> هذا .

ورمز من 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");
    }
}

نصائح أخرى

وأنا حل هذه المشكلة عن طريق هذا

[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 
    }

وأنها بسيطة، ولكن كان لي بالكاد الوقت للتحقق عن أفضل الحلول.

السادة <أ href = على "HTTP: // odetocode كوم / بلوق / سكوت / أرشيف / 2004/08/20 / 401.aspx "يختلط =" نوفولو noreferrer "> ألين و <لأ href =" http://www.bobpowell.net/singleinstance.htm "يختلط =" نوفولو noreferrer "> باول :

    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);
            }
        }
    }

وأنا لا أعرف من البيئة التي تعمل فيها، ولكن شيئا أن نأخذ في الاعتبار حول "تطبيقات مثيل واحد 'هو كيفية تعريف مثيل واحد. إذا كان يمكن تشغيل التطبيق على محطات عمل متعددة في نفس الوقت، وذلك باستخدام مصدر بيانات مشتركة، غير أن المسألة؟ وبالمثل، ماذا عن الوضع الخدمات الطرفية (أو "تشغيل ك" الوضع) حيث يتم تسجيل أكثر من مستخدم في نفس الكمبيوتر، هل تريد أن تقييد التطبيق في مثل هذه الطريقة التي مثيل واحد فقط لكل مستخدم، في -الحاسوب؟ أو هل أنت بخير معها ببساطة أن تكون حالة واحدة لكل مستخدم؟

والجواب على هذه قد تقودك في اتجاه واحد على الآخر. على سبيل المثال، لدينا تطبيق "مثيل واحد" مع نطاق يجري مجموعة من أجهزة الكمبيوتر. يسمح لمستخدم واحد فقط على داخل تلك المجموعة من محطات العمل. تمكنا بذلك من خلال لديهم جدول في منطقتنا المصدر البيانات المشتركة التي تعقب المستخدمين المتصلين حاليا. هذه مسألة صيانة ما تحتاج إليه للتأكد من أن الجدول دقيقة بنسبة 100٪ في كل وقت. التعامل مع أمور مثل انقطاع التيار الكهربائي غير متوقعة على محطة العمل، وترك أخذت سجلات "وهمية" في هذا الجدول بعض معالجة متأنية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top