【发布时间】:2017-03-01 13:26:50
【问题描述】:
我正在尝试这样做,以便如果我的程序的另一个实例正在运行,它应该关闭已经运行的实例并启动新实例。我目前尝试过这个:
[STAThread]
static void Main()
{
Mutex mutex = new System.Threading.Mutex(false, "supercooluniquemutex");
try
{
if (mutex.WaitOne(0, false))
{
// Run the application
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new fMain());
}
else
{
foreach (Process proc in Process.GetProcesses())
{
if (proc.ProcessName.Equals(Process.GetCurrentProcess().ProcessName) && proc.Id != Process.GetCurrentProcess().Id)
{
proc.Kill();
break;
}
}
// Run the application
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new fMain());
}
}
finally
{
if (mutex != null)
{
mutex.Close();
mutex = null;
}
}
}
但由于某种原因,它并没有杀死已经在运行的实例,它只是在大部分时间里杀死自己,有时它根本不做任何事情。
我该怎么做才能让它工作?
编辑:我知道通常的做法是显示应用程序已经在运行的消息,但在这个应用程序中,它杀死旧进程而不是显示消息是至关重要的。
【问题讨论】:
-
那么您是说当您在调试时遇到
proc.Kill();语句,它不会导致进程被杀死? -
我认为你只是不想启动新实例,而不是从已经执行的实例下拉地毯。您可以向用户显示一条消息,然后关闭以明确它无法启动....除非您只是不关心其他应用程序实例在做什么(将某些东西保存到商店,提供一些请求,用户做某事等)。还要考虑可能的终端服务器影响......(承载多个同时登录的服务器)。
-
您确实意识到此的 common 模式是让新实例关闭以支持旧实例(已传输任何参数/将旧实例放在前面) .如果你的用户反其道而行之,用户会感到非常惊讶。
-
我同意伊戈尔的观点。我宁愿显示错误“进程已在运行”并退出而不是终止现有进程。我也不确定你为什么在那里有一个互斥锁。但是,您当前的代码应该可以工作。让我试试看。
-
我知道,这是通常的做法,但我的应用程序的意图要求它反转(新的必须杀死旧的)
标签: c# instance mutex kill multiple-instances