Ограничить несколько экземпляров приложения
Хорошо, поэтому я создал приложение С#, создал для него установщик и установил его на моей машине.
Проблема в том, что когда пользователь дважды открывает приложение exe, будут запущены два экземпляра приложения. Я только хочу, чтобы один экземпляр приложения работал в любое время, как мне это сделать?
Спасибо за вашу помощь,
Ответы
Ответ 1
Общей методикой для этого является создание имени 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");
}
}
Ответ 2
Я решил эту проблему этим
[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
}
это просто, но у меня не было времени проверить лучшие решения.
Ответ 3
Благодаря 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);
}
}
}
Ответ 4
http://www.codeproject.com/KB/cs/CSSIApp.aspx
Ответ 5
Я не знаю среду, в которой вы работаете, но что-то, что нужно помнить о "приложениях с одним экземпляром", - это то, как вы определяете один экземпляр. Если приложение может работать одновременно на нескольких рабочих станциях, используя общий источник данных, это проблема? Аналогично, что касается ситуации с терминальными службами (или ситуации "как работа" ), когда на один и тот же компьютер регистрируется более одного пользователя, вы хотите ограничить приложение таким образом, чтобы только один экземпляр для каждого пользователя за -Компьютер? Или вы в порядке, просто один экземпляр для пользователя?
Ответ на них может привести вас в одном направлении над другим. Например, у нас есть приложение с одним экземпляром, а область - группа компьютеров. В пределах этой группы рабочих станций допускается только один пользователь. Мы справились с этим, указав таблицу в нашем общем источнике данных, которая отслеживала пользователей, подключенных в настоящее время. Это проблема обслуживания, так как вам нужно быть уверенным, что таблица на 100% точна все время. Обработка таких вещей, как непредвиденные отключения электроэнергии на рабочей станции, оставляя "фиктивные" записи в этой таблице, требует некоторой осторожной обработки.