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