2 cqtrq cqtrq 于 2017.01.16 21:54 提问

关于Mutex限制应用程序重复启动的问题

大伙帮忙看看以下代码,整个程序按Release编译通过,但点击运行bin\Release目录下的应用程序EXE文件,居然可以连续启动3个,第4个开始弹出消息“本程序已经启动了,不能再重复运行!”,啥原因?困惑中。。。

 static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            bool flag = false;
            Mutex mutex = new Mutex(true, System.Diagnostics.Process.GetCurrentProcess().ProcessName, out flag);
            if (flag)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new FormStockTrading());
            }
            else
            {
                MessageBox.Show("本程序已经启动了,不能再重复运行!");
                Environment.Exit(1);
            }
        }
    }

4个回答

weixin_35997138
weixin_35997138   2017.01.16 22:44
已采纳

ㄜ....

我這邊根據你提供samplecode 下執行後,在Release 執行.exe 只可以點擊執行一次,因為你已經用Mutex 保護該Process執行,
所以你能夠執行多次實屬怪異...
你確定你執行.exe檔 是一樣的嗎??

cqtrq
cqtrq 热心大牛越来越少了,致谢初心!
一年多之前 回复
cqtrq
cqtrq 我跟你一样用最简单的Application.Run(new Form1())测试,Mutex机制工作正常。但对于特定的Form需要在加载时进行联网数据读取和分析等耗时操作,即使等待上一个实例加载完毕再启动下一个实例,Mutex机制似乎不可靠
一年多之前 回复
cqtrq
cqtrq 确认是的,你设置下加载窗体的持续时间看看。我的窗体因为要预处理数据大概需要1分钟左右才能加载完毕。
一年多之前 回复
welan123123
welan123123   2017.01.17 09:23

你这flag是不是其他地方还用到了,换一下名字

cqtrq
cqtrq 重新命名了flag,测试结果还是可以多次启动。。。
一年多之前 回复
cqtrq
cqtrq   2017.01.19 22:55

图片说明
今天测试居然最多启动了5个应用,第6个才弹出消息框,彻底晕了。。。

cqtrq
cqtrq   2017.01.20 21:09

再次验证了,用最简单的Application.Run(new Form1())测试,并在窗体加载时添加如下的延时语句,Mutex机制瓦解了。。。我只是一个业余编程爱好者。。。大牛们帮忙解答下,谢啦

private void Form1_Load(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(60000 * 2);
}
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C#多线程开发9:使用Mutex类禁止应用程序启动两次
使用Mutex类可以创建有名称的互斥,而系统可以识别有名称的互斥,因此可以使用Mutex类禁止应用程序启动两次。 下面是此种场景的演示代码。 using System; using System.Threading; namespace Run1InstanceExample { class Program { [STAThread] stati
WPF 只允许运行一个程序(单例)
问题描述: 有时一个程序需要单例运行,因为涉及到上下位连接,数据库访问,安全性等问题,本博客来探讨如何实现WPF 程序的单例运行。 措施: 利用 System.Threading.Mutex 来实现控制程序的单例运行。
C#利用Mutex实现只运行一个程序实例
static void Main()        {            bool canCreateNew;                        //限制单例运行            Mutex m = new Mutex(true, "AnyName", out canCreateNew);            if (canCreateNew)            {  
保证mfc应用程序只被打开一次
在xxx.cpp文件中添加: 1、定义全局变量 : #define UNIQUE_APP "{opencamera_fykj} 2、在BOOL CopencameraApp::InitInstance()函数中添加: HANDLE hOneInstance; hOneInstance = ::CreateMutex(NULL, FALSE, UNIQUE_APP); if(GetLastE
WPF 禁止同一程序同时启动
// 用于获取当前进程名称 //MessageBox.Show(Process.GetCurrentProcess().ProcessName);             Process[] pro = Process.GetProcesses();             int n = pro.Where(p => p.ProcessName.Equals("进程名字")
C#利用Mutex互斥量实现同时只有一个进程实例在运行
我们在做程序时,有时候希望在一台电脑上面只有一个进程实例在运行,利用Mutex互斥量可以实现了这个功能,方法及步骤如下:关于互斥量Mutex的理解及用法可以参考博客http://blog.csdn.net/xwdpepsi/article/details/6346890接下来分控
WPF 只允许运行一个程序(单例)(转)
问题描述: 有时一个程序需要单例运行,因为涉及到上下位连接,数据库访问,安全性等问题,本博客来探讨如何实现WPF 程序的单例运行。 措施: 利用 System.Threading.Mutex   来实现控制程序的单例运行。 这是MSDN 官方的资料: Mutex : http://msdn.microsoft.com/en-us/library/
qt防止重复启动
通常我们的程序需要访问各种资源,如果同时起多份实例,造成资源争用,带来混乱。因此需要一个方法保证任何时候只起一个实例。在qt中可以借助共享内存来实现。QSharedMemory有一个create方法,在qt帮助里这么描述:bool QSharedMemory::create(int size, AccessMode mode = ReadWrite)Creates a shared memory ...
Mutex 限制应用程序只能单启动
Mutex 同时只能启动一次应用程序。
防止C++程序重复打开
我们有些程序是可以同时运行多个进程,典型的像Visual Studio.但有些就能一次运行一个进程.比如Outlook.那你可能会问啥时可以让它同时打开多个应用程序,啥时只能一个啊.这个主要看进程间是否独立,会不会有冲突,是否会时读写相同的文件. 如果你不写代码去做些处理默认肯定是可以让你同时运行多个进程的.那假如只能一次运行一个进程咋整呢?有两种常用的方式.   使用互斥(Mutex)