2012-01-07 2 views
4

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

+11

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

+0

Создайте именованное событие. Посмотрите на то, как это сделать [здесь] [1] [1]: http://stackoverflow.com/questions/447546/creating-win32-events-from-c-sharp – Odys

+0

Hans если вы сделаете этот комментарий фактическим ответом, я дам вам выбранный ответ. –

ответ

4

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

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

3

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

     } 
    } 
} 
+0

Хороший и чистый ответ! голосовать – Sylca

Смежные вопросы