我想让它如此,如果我的程序的另一个实例正在运行,它应该关闭已运行的实例并启动新实例。我目前试过这样:如果程序正在运行,杀死其他实例?
[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();'语句,它不会导致进程被终止? –
我认为你只是不想开始新的实例,而不是从一个已经执行的实例下拉开地毯。您可以向用户显示一条消息,然后关闭以清楚表明它无法启动....除非您不关心其他应用程序实例在做什么(将某些内容保存到某个商店,请求,用户做某事等)。也考虑可能的终端服务器含义......(承载多个同时登录的服务器)。 – Igor
你的确意识到* common *模式是为了让新实例关闭而转换旧的(转移了任何参数/将旧参数带到前面)。让用户以其他方式采取行动会让你感到非常惊讶。 –