首页 新闻 会员 周边 捐助

实现程序重启并只允许运行一个实例

0
悬赏园豆:10 [已解决问题] 解决于 2018-06-30 19:34

使用Mutex(互斥量)实现程序只运行一个实例没有问题
程序的重启
Application.Restart();
Current.Shutdown();
也没有问题
两者结合在一块就有点问题了,不知各位有没有什么好的方式.

考虑过将程序重启的状态保存,然后程序启动后先判断是否是程序重启再运行程序,可以实现但是实现方式有点别扭

高效养猪倌的主页 高效养猪倌 | 初学一级 | 园豆:196
提问于:2018-06-25 11:38
< >
分享
最佳答案
0

要实现进程运行一个实例的功能容易,要在任何情况下都严格如此,不可能。至少有那么一瞬间也是有两个实例的。

收获园豆:4
空明流光 | 初学一级 |园豆:111 | 2018-06-25 14:02
其他回答(2)
0

不需要shutdown,直接main return即可。

 

如果是进程控制进程,那么直接判断process就可以了。

收获园豆:3
花飘水流兮 | 园豆:13617 (专家六级) | 2018-06-25 13:45
0

不需要Shutdown,发现已经运行了,就显示出来:

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
    if (ProgramRunningChecker.IsRuning(Application.ProductName))
        return;

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new MainForm());
}

 

private static Mutex m;

/// <summary>
/// 检查程序是否已经运行
/// </summary>
/// <param name="programName">程序名称</param>
public static bool IsRuning(string programName)
{
    bool createdNew;
    //Global为全局,表示即使通过远程桌面连接过来,也只是允许运行一次
    string mutexName = "Global\\" + programName;
    m = new Mutex(false, mutexName, out createdNew);
    if (!createdNew)
    {
        Process currentProcess = Process.GetCurrentProcess();
        foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
        {
            if (process.Id != currentProcess.Id)
            {
                SetForegroundProcess(process);
                break;
            }
        }
    }
    return !createdNew;
}
收获园豆:3
大豆男生 | 园豆:608 (小虾三级) | 2018-06-27 18:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册