2014-10-19 1 views
0

Мое приложение проверяет при запуске, если какой-либо другой экземпляр его уже запущен, если да, то он закроет все остальные экземпляры. Для этого я попытался использовать функцию Process.GetProcessByName («AppName») и сохранить весь процесс с AppName в массивах процессов []. Теперь я хочу найти PID текущего экземпляра, чтобы я мог закрыть все другие экземпляры моего приложения (которые, очевидно, имеют одинаковое имя, но разные PID). Но я не могу найти это даже после многоголоджинга. Также как я могу найти PID экземпляра моего приложения, которое я создал с помощью функции Process.Start («AppName.exe») изнутри AppName.exeКак получить PID моего приложения во время выполнения с помощью C#

+1

возможно дубликат [Получение PID процесса, созданного в C#] (HTTP://stackoverflow.com/questions/2539920/getting-a-pid-of-a-process-created-in-c-sharp) – Chris

ответ

0

ОК, учитывая проблемы с моим другим решением, видим следующее

Для того, чтобы подключить между процессами, вам потребуется некоторая форма IPC. Чтобы использовать упрощенность общих ручек между EventWaitHandles, вы можете заставить каждую программу прослушивать флаг отмены.

public static EventWaitHAndle CancellationEvent = 
    new EventWaitHandle(
     false, 
     EventResetMode.AutoReset, 
     "MyAppCancel"); 
private object lockObject = new object(); 

А потом ...

Task.Run(() => 
{ 
    while(true) 
    { 
     CancellationEvent.WaitOne(); 
     lock(lockObject) 
      if(!thisIsCalling) // static bool to prevent this program from ending itself 
       Environment.Exit(0); 
    } 
} 

И затем вызвать отмену как так

lock(lockObject) 
{ 
    thisIsCalling = true; 
    CancellationEvent.Set(); 
    thisIsCalling = false; 
} 
+0

Спасибо. Кажется, он работает нормально. Приветствия. :) – Sanyam

0

Почему бы вам просто не проверить равенство с вашим текущим обработать?

var processes = Process.GetProcessByName("AppName"); 

foreach (var p in processes) 
{ 
    if (p != Process.GetCurrentProcess()) 
     p.CloseMainWindow(); 
} 
0

Если вы заинтересованы в закрытии других экземпляров своего приложения, почему бы не сделать наоборот и предотвратить открытие нескольких экземпляров в первую очередь? Использование EventWaitHandle может сделать это таким образом:

bool created; 
var eve = new System.Threading.EventWaitHandle(
    false, 
    EventResetMode.AutoReset, 
    "MyAppHandle", 
    out created); 
if(!created) 
{ 
    eve.Set(); 
    Environment.Exit(-1); // Always use an exit error code if you're expecting to call from the console! 
} 

Параметр ручка, «MyAppHandle» в этом случае, будут распределены по всей системе, таким образом, имея в виду не только будет out created paramete ложным на вторичных instaces, но вы можете используйте eve.Set(), чтобы заставить ручку запускать приложение acorss. Настройте прослушивающий поток, и это может позволить контуру сообщения отображать сообщение при попытке открыть второй экземпляр.

Task.Run(() => 
{ 
    while(true) 
    { 
     eve.WaitOne(); 
     // Display an error here 
    } 
} 
+0

Спасибо Aravol. Но другой экземпляр моего приложения работает в какой-то другой цели одновременно. Поэтому мне нужны и другие экземпляры, но в какой-то момент я должен их закрыть (когда их работа с связанными файлами завершена). – Sanyam

+0

В этом случае это бесполезно! Тем не менее, вы смотрите на аналогичный IPC, поэтому позвольте мне дать вам еще один ответ ~ – David

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