如何使用C#在运行时获取我的应用程序的PID

时间:2014-10-19 22:28:27

标签: c# process pid instances

我的应用程序在启动时检查是否已有任何其他实例正在运行,如果是,那么它将关闭所有其他实例。为此,我尝试使用Process.GetProcessByName(“AppName”)函数并将所有进程与AppName存储在processes []数组中。现在我想找到当前实例的PID,以便我可以关闭我的应用程序的所有其他实例(显然具有相同的名称但不同的PID)。但即使经过大量的谷歌搜索,我也无法找到它。另外,我如何找到我的应用程序实例的PID,我使用从AppName.exe内部调用的Process.Start(“AppName.exe”)函数创建了

3 个答案:

答案 0 :(得分:0)

为什么不直接检查当前流程的平等性?

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

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

答案 1 :(得分: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参数在次要实例中是假的,而且您可以使用eve.Set()来实现导致手柄发射应用。设置监听线程,这可以允许消息循环在您尝试打开第二个实例时显示消息。

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

答案 2 :(得分: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;
}