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

C# 如何使用C在运行时获取我的应用程序的PID,c#,process,pid,instances,C#,Process,Pid,Instances,我的应用程序在启动时检查是否有任何其他相同的实例正在运行,如果是,它将关闭所有其他实例。为此,我尝试使用Process.GetProcessByNameAppName函数,并将所有具有AppName的进程存储在processs[]数组中。现在我想找到当前实例的PID,这样我就可以关闭我的应用程序的所有其他实例,这些实例显然具有相同的名称,但PID不同。但即使在谷歌搜索了很多次之后,我也找不到。另外,如何找到我用Process.StartAppName.exe函数创建的应用程序实例的PID,该函数

我的应用程序在启动时检查是否有任何其他相同的实例正在运行,如果是,它将关闭所有其他实例。为此,我尝试使用Process.GetProcessByNameAppName函数,并将所有具有AppName的进程存储在processs[]数组中。现在我想找到当前实例的PID,这样我就可以关闭我的应用程序的所有其他实例,这些实例显然具有相同的名称,但PID不同。但即使在谷歌搜索了很多次之后,我也找不到。另外,如何找到我用Process.StartAppName.exe函数创建的应用程序实例的PID,该函数是从AppName.exe内部调用的

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!
}
handle参数MyAppHandle(在本例中为MyAppHandle)将在整个系统中共享,这意味着在二级Instance上创建的参数不仅将为false,而且您可以使用eve.Set使句柄触发acorss应用程序。设置一个侦听线程,这样可以允许消息循环在您尝试打开第二个实例时显示消息

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

可能重复感谢阿拉沃。但我的应用程序的另一个实例同时用于其他目的。因此,我也需要其他实例,但在某些时候,当它们处理相关文件的工作结束时,我必须关闭它们。在这种情况下,这是无用的!然而,你们看到的是类似的IPC,所以让我为你们提出另一个答案~