簡體   English   中英

如何使用C#在運行時獲取我的應用程序的PID

[英]how to get PID of my app at runtime using C#

我的應用程序在啟動時會檢查是否有其他實例正在運行,如果是,則它將關閉所有其他實例。 為此,我嘗試使用Process.GetProcessByName(“ AppName”)函數,並將所有帶有AppName的進程存儲在processes []數組中。 現在,我想查找當前實例的PID,以便可以關閉我的應用程序的所有其他實例(顯然,它們具有相同的名稱,但具有不同的PID)。 但是即使經過大量谷歌搜索,我也找不到。 另外,我如何找到使用AppName.exe內部調用的Process.Start(“ AppName.exe”)函數創建的我的應用程序實例的PID

您為什么不只檢查當前流程的平等性?

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
    }
}

好的,鑒於我的其他解決方案有問題,請參閱以下內容

為了在進程之間進行切換,您需要某種形式的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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM