Какой самый безопасный способ предотвратить несколько экземпляров программы? - PullRequest
4 голосов
/ 07 января 2012

Я пытаюсь запретить моей программе запускать несколько экземпляров в любой момент времени.Я читал об использовании мьютекса и событий Windows, однако обоим потокам было несколько лет, и мне интересно, есть ли в .net4 более простой и более элегантный способ справиться с этим?Мне показалось, что я прочитал о настройке формы, которая позволяет вам отказать в нескольких экземплярах по свойству?Может ли кто-то пролить свет на то, какой самый безопасный и / или самый простой способ предотвратить несколько экземпляров программы?

Ответы [ 3 ]

4 голосов
/ 04 июня 2012

Самый безопасный способ - использовать встроенную поддержку в свойстве .NET, WindowsFormsApplicationBase.IsSingleInstance.Трудно догадаться, если это уместно, вы не приложили много усилий для описания ваших точных потребностей.И нет, ничего не изменилось за последние 5 лет.- Ганс Пассант 7 января в 0: 38

Это был лучший ответ, но Ганс не представил его в качестве ответа.

3 голосов
/ 07 января 2012

В VB вы можете установить это на уровне проекта (Свойства> Общие) для проектов Winforms.

В C # вы можете использовать код, похожий на этот ... необходимо преобразование, конечно ..

Dim tGrantedMutexOwnership As Boolean = False
Dim tSingleInstanceMutex As Mutex = New Mutex(True, "MUTEX NAME HERE", tGrantedMutexOwnership)

If Not tGrantedMutexOwnership Then
'
' Application is already running, so shut down this instance
'
Else
' 
' No other instances are running
'
End If

Ой, я забыл упомянуть, что вам нужно будет поставить GC.KeepAlive(tSingleInstanceMutex) после вызова Application.Run ()

1 голос
/ 06 января 2013
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Windows.Forms;

namespace YourNameSpaceGoesHere
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {

            if (Process.GetProcessesByName("YourFriendlyProcessNameGoesHere").Length > 1)
            {
                MessageBox.Show(Application.ProductName + " already running!");
                Application.ExitThread();
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new YourStartUpObjectFormNameGoesHere());
            }

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...