C# 创建唯一实例后使用Application.Restart()

caixin99 2009-11-06 08:31:49
使用如下方法保证程序启动唯一实例:
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()后,会提示本程序已经运行。

怎样启用唯一实例,又可以实现重新启动程序的功能???
...全文
2198 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
oqqBoy123 2012-10-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

LZ也不把答案帖出来,碰到类似问题,补上来

Program中

C# code
static class Program
{
public static System.Threading.Mutex Run;
/// <summary>
/// 应用程序的主入口点。
/// </summary>
……
[/Quote]
太感谢了
haibin_hu 2012-10-17
  • 打赏
  • 举报
回复
7楼的答案太有用了
xzq2002 2010-09-19
  • 打赏
  • 举报
回复
Process.Start(Application.ExecutablePath);
Process p = Process.GetCurrentProcess();
p.Kill();
caixin99 2009-12-04
  • 打赏
  • 举报
回复
...
龙宜坡 2009-12-01
  • 打赏
  • 举报
回复
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();
}
caixin99 2009-11-06
  • 打赏
  • 举报
回复
搞定了,谢谢!
闪亮的人生 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gomoku 的回复:]
class Program
{
  public static System.Threading.Mutex mutex;
  static void Main()
  {
      //...
  }
}

ps:
把System.Threading.Mutex mutex写成一个静态成员后,就不用在Main()中mutex.ReleaseMutex();
而关闭Mutex可以直接用Program.mutex.Close(); 这里它跟Dispose的作用一样。
[/Quote]
mark
gomoku 2009-11-06
  • 打赏
  • 举报
回复
class Program
{
public static System.Threading.Mutex mutex;
static void Main()
{
//...
}
}

ps:
把System.Threading.Mutex mutex写成一个静态成员后,就不用在Main()中mutex.ReleaseMutex();
而关闭Mutex可以直接用Program.mutex.Close(); 这里它跟Dispose的作用一样。
gomoku 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gomoku 的回复:]
在重起程序前把Mutex释放掉。

C# codenew System.Threading.Mutex(true, Application.ProductName).ReleaseMutex();
Application.Restart();
[/Quote]
我的错,单单ReleaseMutex是不行的。

可能你要把System.Threading.Mutex mutex写成一个静态成员(以便从其它地方用它)。
然后调用下面一行来关闭句柄。
(Program.mutex as IDisposable).Dispose();
gomoku 2009-11-06
  • 打赏
  • 举报
回复
在重起程序前把Mutex释放掉。


new System.Threading.Mutex(true, Application.ProductName).ReleaseMutex();
Application.Restart();
编程有钱人了 2009-11-06
  • 打赏
  • 举报
回复
先Application.Exit(); 紧接着Application.Restart()

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧