• C# 实现程序只启动一次(实现程序自重启)


    程序运行过程中,不能有多个实例运行,并且需要程序自己可以重启(重新运行),所以代码如果下代码:

    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();
    }

    用以上代码实现了禁止多重启动的功能。
    同时程序关闭重启是通过下面的代码实现的:
    Process.Start(Process.GetCurrentProcess().ProcessName + ".exe");
    Application.Exit();
    这时就出现一个问题,程序自动关闭重启的时候就会提示已经启动了一个程序了。
    请问应该怎么解决?
    关闭之后过一会儿再启动是没问题的。
    但是现在自动关闭,自动重启有的时候能成功,有的时候就被禁止多重启动的那个截住了。
    那就必须手动重新启动了。
    比如,点【重新启动】按钮的时候执行以下代码:
    Process.Start(Process.GetCurrentProcess().ProcessName + ".exe");
    Application.Exit();
    这时它是先启动一个新的Process然后才退出当前程序。
    这时就会在Program.cs里遇到禁止多重启动的那段代码。就不能自动启动了

    解决方案
    -----------------------------
    解决方法一:
    一般程序:
    因为进程还没有中止,还占在内存中所以才会报错.
    出现这种原因的情况可能是:使用多线程,其中的线程没有执行结束,也没有被置为后台线程,所以虽然应用程序关闭,但进程仍驻留在内存中.
    可以使用Application.ExitThread();中止进程中的所有线程.
    也可以在进程执行中获得进程的ID,然后通过Process.GetProcessById()获得这个进程,然后将它Kill掉,再启动新的进程.

    解决方法二:
    要不就在用户点[重新启动]时,把mutex先释放掉?可能需要把那个mutex变量做成一个global,这样你在两个地方都能访问到。然后在程序退出时(Application.Run下面那一句),检查一下如果mutex已经被释放了,就不要再释放了。

    解决方法三:
    或者就在点[重新启动]时再设另外一个不同的信号量,当第二个程序重入时如果看到这个信号量说明是自动重启的情况,就不报错而直接正常往下走了。这个信号量可以在第一个程序[重新启动]那里执行完后再释放,不过应该也可以在整个程序退出时检查一下如果存在就释放。

  • 相关阅读:
    Java实现 LeetCode 617 合并二叉树(遍历树)
    Java实现 LeetCode 611 有效三角形的个数(双指针)
    Java实现 LeetCode 611 有效三角形的个数(双指针)
    Java实现 LeetCode 611 有效三角形的个数(双指针)
    Java实现 LeetCode 609 在系统中查找重复文件(阅读理解+暴力大法)
    Java实现 LeetCode 609 在系统中查找重复文件(阅读理解+暴力大法)
    PHP mb_substr() 函数
    PHP substr() 函数
    PHP strtr() 函数
    PHP strtoupper() 函数
  • 原文地址:https://www.cnblogs.com/mq0036/p/4138523.html
Copyright © 2020-2023  润新知