C# 实现软件的重启

    xiaoxiao2023-10-22  162

    C# 实现软件的重启

    Application.Restart();

    如果使用了Mutex 判断程序单例, 重启时需要_mutex.Dispose();

    有些时候我们想用户在设置完之后使程序重新启动生效,这时候我们只需要简单的应用一下代码即可:

    1

    2

    3

    4

    5

    if (MessageBox.Show("设置保存成功,下次启动时生效,是否马上重启软件?","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question) == DialogResult.Yes)

    {

        Application.Exit();

        System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location);

    }

      

    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已经被释放了,就不要再释放了。

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

    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【关注我】。(●'◡'●)

    如果你觉得本篇文章对你有所帮助,请给予我更多的鼓励,求打             付款后有任何问题请给我留言!!!

    因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【Jack_孟】!

    分类: C#

    最新回复(0)