一、问题
C# 创建唯一实例后使用Application.Restart()
唯一程序实例 与 程序重新启动的冲突
二、解决方案
1、定义一个 Bool 型静态变量 NeedRestart 默认为 false;
2、定义一个静态函数 RestartApplication ,逻辑为将 Bool 型静态变量 NeedRestart 设置为 true 并调用退出程序的函数 Application.Exit();
3、在程序唯一实例互斥量自动释放后根据 NeedRestart 判断是否重启软件。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.VisualBasic;
using Microsoft.VisualBasic.ApplicationServices;
namespace RSSCSSvcManager
{
static class Program
{
/// <summary>
/// 设置一个是否需要重启的标志
/// </summary>
public static bool NeedRestart = false;
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
bool createNew = false;
using( System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out createNew))
{
if (createNew)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
else
{
MessageBox.Show("Program is running...");
System.Threading.Thread.Sleep(1000);
System.Environment.Exit(1);
}
}
// 互斥量自动释放后重启软件
if (NeedRestart)
{
Application.Restart();
// System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location);
}
}
/// <summary>
/// 设置需要重启软件标志并退出程序
/// </summary>
public static void RestartApplication()
{
NeedRestart = true;
Application.Exit();
}
}
}