Как получить PID моего приложения во время выполнения с помощью C#

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

3 ответа

Решение

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

Для того, чтобы подключиться между процессами, вам нужна некоторая форма 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;
}

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

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

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

Если вы заинтересованы в закрытии других экземпляров вашего приложения, почему бы не сделать обратное и не предотвратить открытие нескольких экземпляров? Использование 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 Параметр будет ложным на вторичных объектах, но вы можете использовать eve.Set() чтобы вызвать ручку, чтобы огонь применение. Настройте поток прослушивания, и это может позволить циклу сообщений отображать сообщение при попытке открыть второй экземпляр.

Task.Run(() =>
{
    while(true)
    {
        eve.WaitOne();
        // Display an error here
    }
}
Другие вопросы по тегам