使用如下方法保证程序启动唯一实例:
bool ret;
System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out ret); 
if (ret)
{
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new FrmMain());
                
                //Main为你程序的主窗体,如果是控制台程序不用这句   
                mutex.ReleaseMutex();
 }
 else
 {
     MessageBox.Show(null, "本程序已经运行", Application.ProductName,      MessageBoxButtons.OK,MessageBoxIcon.Warning);
                Application.Exit();
}问题:
我想重启程序。
我在代码中使用Application.Restart()后,会提示本程序已经运行。怎样启用唯一实例,又可以实现重新启动程序的功能???

解决方案 »

  1.   

    先Application.Exit(); 紧接着Application.Restart()
      

  2.   

    在重起程序前把Mutex释放掉。
    new System.Threading.Mutex(true, Application.ProductName).ReleaseMutex();
    Application.Restart();
      

  3.   

    我的错,单单ReleaseMutex是不行的。可能你要把System.Threading.Mutex mutex写成一个静态成员(以便从其它地方用它)。
    然后调用下面一行来关闭句柄。
    (Program.mutex as IDisposable).Dispose();
      

  4.   

    class Program
    {
       public static System.Threading.Mutex mutex;
       static void Main()
       {
           //...
       }
    }ps:
    把System.Threading.Mutex mutex写成一个静态成员后,就不用在Main()中mutex.ReleaseMutex(); 
    而关闭Mutex可以直接用Program.mutex.Close(); 这里它跟Dispose的作用一样。
      

  5.   

    LZ也不把答案帖出来,碰到类似问题,补上来Program中    static class Program
        {
            public static System.Threading.Mutex Run;
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                bool noRun = false;
                Run = new System.Threading.Mutex(true, "HumControl", out noRun);
                //检测是否已经运行
                if (noRun)
                {//未运行
                    Run.ReleaseMutex();
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    
                    Application.Run(new FrmMain());
                }
                else
                {//已经运行
                    //MessageBox.Show("已经有一个实例正在运行!");
                    //切换到已打开的实例
                }
            }
        }
    需要重新启动时
    DialogResult _dlgResult;
    _dlgResult = MessageBox.Show("保存设置成功,需要重新启动应用程序后生效。\r\n立即重新启动程序?", 
                        "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
                    if (_dlgResult == DialogResult.OK)
                    {
                        Program.Run.Close();
                        Application.Restart();
                    }
      

  6.   

    Process.Start(Application.ExecutablePath);
    Process p = Process.GetCurrentProcess();
    p.Kill();