程序运行过程当中,不能有多个实例运行,而且须要程序本身能够重启(从新运行),因此代码若是下代码:多线程
static void Main() { bool createNew; using (System.Threading.Mutex m = new System.Threading.Mutex(true, Application.ProductName, out createNew)) { if (createNew) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } else { MessageBox.Show("Only one instance of this application is allowed!"); } } }
Boolean createdNew; //返回是否赋予了使用线程的互斥体初始所属权
System.Threading.Mutex instance = new System.Threading.Mutex(true, "MutexName", out createdNew); //同步基元变量
if (createdNew) //赋予了线程初始所属权,也就是首次使用互斥体
{
Application.Run(new Form1()); /s/这句是系统自动写的
instance.ReleaseMutex();
}
else
{
MessageBox.Show("已经启动了一个程序,请先退出!","系统提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
Application.Exit();
}app
用以上代码实现了禁止多重启动的功能。
同时程序关闭重启是经过下面的代码实现的:
Process.Start(Process.GetCurrentProcess().ProcessName + ".exe");
Application.Exit();
这时就出现一个问题,程序自动关闭重启的时候就会提示已经启动了一个程序了。
请问应该怎么解决?
关闭以后过一下子再启动是没问题的。
可是如今自动关闭,自动重启有的时候能成功,有的时候就被禁止多重启动的那个截住了。
那就必须手动从新启动了。
好比,点【从新启动】按钮的时候执行如下代码:
Process.Start(Process.GetCurrentProcess().ProcessName + ".exe");
Application.Exit();
这时它是先启动一个新的Process而后才退出当前程序。
这时就会在Program.cs里遇到禁止多重启动的那段代码。就不能自动启动了this
解决方案
-----------------------------
解决方法一:
通常程序:
由于进程尚未停止,还占在内存中因此才会报错.
出现这种缘由的状况多是:使用多线程,其中的线程没有执行结束,也没有被置为后台线程,因此虽然应用程序关闭,但进程仍驻留在内存中.
可使用Application.ExitThread();停止进程中的全部线程.
也能够在进程执行中得到进程的ID,而后经过Process.GetProcessById()得到这个进程,而后将它Kill掉,再启动新的进程.spa
解决方法二:
要不就在用户点[从新启动]时,把mutex先释放掉?可能须要把那个mutex变量作成一个global,这样你在两个地方都能访问到。而后在程序退出时(Application.Run下面那一句),检查一下若是mutex已经被释放了,就不要再释放了。线程
解决方法三:
或者就在点[从新启动]时再设另一个不一样的信号量,当第二个程序重入时若是看到这个信号量说明是自动重启的状况,就不报错而直接正常往下走了。这个信号量能够在第一个程序[从新启动]那里执行完后再释放,不过应该也能够在整个程序退出时检查一下若是存在就释放。code