【发布时间】:2009-07-13 05:20:03
【问题描述】:
我正在使用 c# windows 应用程序。
当我的应用程序启动时,我想检查 同一应用程序的任务管理器。如果任何实例已经在运行, shud 杀死进程并启动新进程。
这是为了确保只有一个应用程序实例正在运行。
【问题讨论】:
标签: c#-3.0
我正在使用 c# windows 应用程序。
当我的应用程序启动时,我想检查 同一应用程序的任务管理器。如果任何实例已经在运行, shud 杀死进程并启动新进程。
这是为了确保只有一个应用程序实例正在运行。
【问题讨论】:
标签: c#-3.0
这是一种确保只有一个程序实例在运行的快速而肮脏的方法。秘诀是使用互斥锁。
[STAThread]
static void Main()
{
bool ok;
m = new System.Threading.Mutex(true, "YourNameHere", out ok);
if (!ok)
{
MessageBox.Show("Another instance is already running.");
return;
}
// Do some stuff here...
GC.KeepAlive(m);
}
此代码尝试创建具有特定名称的 Mutex(互斥),如果无法创建,则该程序的实例必须已在运行。
【讨论】:
对我来说,这听起来很激进,可能不是最好的主意。
【讨论】:
public Process[] ExistingProcesses()
{
string processName = Process.GetCurrentProcess().ProcessName;
Process[] processes = Process.GetProcessesByName(processName);
return processes;
}
【讨论】:
检查现有实例的传统方法是使用命名句柄,例如互斥体,而不是依赖于进程名称,甚至可能通过重命名可执行文件而意外失败。启动时检查是否已经存在,如果存在则立即关闭。
编辑
我刚刚又读了一遍这个问题,听起来你真的想杀死前一个实例,而不是杀死新实例。我记得最接近这种行为的是谷歌浏览器在你打开一个新窗口而旧窗口没有响应时所做的事情,但即使这样也会检查没有响应,然后提示用户。杀死旧进程听起来有点极端。你确定那是你想要做的吗?
【讨论】: