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

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

时间: 2024-11-07 21:40:22

C# 实现程序只启动一次(实现程序自重启)的相关文章

C# 实现程序只启动一次(总结)

我前面的三篇文章是从网上找到的(如下链接),都说是实现程序只启动一次的功能. C#防止程序多次运行C#检测程序重复运行的函数(可以在多用户登录情况下检测)C# 实现程序只启动一次(多次运行激活第一个实例,使其获得焦点,并在最前端显示) C# 实现程序只启动一次(实现程序自重启) 如果你已经读了前面的几篇文章,我相信你自己或许已经有答案了,我自己用下来感觉还是有一些区别的,现在把我总结的记录下来: 一:使用System.Threading.Mutex类 using (System.Threadin

程序只启动一个实例的几种方法

我们在使用<金山词霸>时发现,在<金山词霸>已经运行了的情况下,再次点击<金山词霸>的图标,那么它不会再运行另外一个<金山词霸>,而是将已有的<金山词霸>给激活,始终只能运行一个<金山词霸>的实例. 在我们的程序当中如果要实现类似<金山词霸>的功能,就要解决两个问题,首先是要判断该程序已有一个实例在运行,其次是要将已运行的应用程序实例激活,同时退出第二个应用程序实例.  对于第一个问题,我们可以通过设置命名互斥对象或命名信

【转】引导界面(五)实现应用程序只启动一次引导界面

这篇文章算是对整个引导界面开发专题的一个终结了吧,个人觉得大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要是在今后的开发中遇到了更好玩,更有趣的引导界面,博主也会在这里及时的跟大家分享,今天的内容主要是教大家的应用程序只有在第一次启动的时候显示引导界面,以后在启动程序的时候就不再显示了. 其实要想实现这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单,下面来详细介绍一下这个类的使用方法 一.SharedPreferences的详

【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面

大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要想实现应用程序只启动一次引导界面这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单,下面来详细介绍一下这个类的使用方法 1.SharedPreferences的详细介绍和用法 其实在 20.游戏开发基础(游戏数据存储)中已经有过介绍了,为了文章的完整还是再介绍一遍. 做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库

【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面

[Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界面开发专题的一个终结了吧,个人觉得大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要是在今后的开发中遇到了更好玩,更有趣的引导界面,博主也会在这里及时的跟大家分享,今天的内容主要是教大家的应用程序只有在第一次启动的时候显示引导界面,以后在启动程序的时候就不再显示了

Chrome浏览器启动报错:应用程序无法启动,因为应用程序的并行配置不正确。

因为国庆节了,难得关一次机(可能搞IT的习惯吧),结果给祖国庆祝完70寿辰之后归来,启动电脑,就打不开Chrome浏览器了,报错如下: 应用程序无法启动,因为应用程序的并行配置不正确.有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具. 然后我对比了我以前安装的Chrome和现在的Chrome文件夹,发现只有如下目录中的不同(其他都一样): 问题就出现在这个目录中的:67.0.3396.99.manifest配置文件 解决方法:只需要把67.0.3396.99.m

打开某exe提示&quot;应用程序无法启动,因为应用程序的并行配置不正确……&quot;的解决方案

本人在新安装好了的windows server 2008 r2 (64位)上运行"RefilesName V2.0(文件批量改名).exe",结果提示: 应用程序无法启动,因为应用程序的并行配置不正确.有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具. 开始安装了64位的VC++ 2010.2015等,但仍未解决.最后安装了32位的VC++ 2005,问题解决. Microsoft Visual C++ 2005 SP1 Redistributable

让程序只启动一个实例

在应用程序的InitInstance方法中,添加如下几行代码: CreateMutex(NULL,true,m_pszAppName); if(GetLastError() == ERROR_ALREADY_EXISTS) { AfxMessageBox(_T("程序已启动"),MB_OK | MB_APPLMODAL | MB_ICONSTOP); return false; }

普中PZISP自动下载软件出现应用程序无法启动,因为应用程序的并行配置不正确的问题

普中的自动下载软件是用Visual C++开发的Windows应用程序,因此在运行时需要库的支持才能在没有安装Visual C++的计算机上正常运行,也可以在开发软件时选择"在静态库中使用 MFC",从而将调用的库函数的代码嵌入应用程序,避免对运行时库的依赖. 在安装vcredist_x86运行库后,问题得到有效解决: 安装运行库后,软件可以运行了. 因此,在以后的学习中如果遇到应用程序无法启动的问题,要考虑是否是因为程序的运行支持库文件不全引起的. 在平时的学习中遇到问题,首先是根据