做禁止winform多开,在program的Main函数中调用Application.Exit()方法,发现无效,最后改用return实现效果bool blnIsRunning;
Mutex mutexApp = new Mutex(false, Assembly.GetExecutingAssembly().FullName, out   blnIsRunning);
if (!blnIsRunning) {
MessageBox.Show("程序已经运行!", Application.ProductName,
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
那Application.Exit用在Program的Main函数中是不是没有意义呢?看了很多人写的禁止多开的代码都在Main函数的if判断中用了Application.Exit,有何作用?

解决方案 »

  1.   

    static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Process instance = RunningInstance();
                if (instance == null)
                {
                    //没有实例在运行                Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    AboutConfig.InitAppSettings();
                    //获取数据库连接字符串  *****
                    Init obj = new Init();
                    if (!obj.GetConnectionString())
                    {
                        MessageBox.Show("无法获取数据库连接字符串!程序中止", Pub.Sys_PromptCaption);
                        Application.Exit();
                        return;
                    }
                    //if (new fmLogin().ShowDialog() == DialogResult.OK)
                    //{
                    //    Application.Run(new fmLogin());
                    //}
                    //else
                    //{
                    //    return;
                    //}
                    Application.Run(new fmLogin());
                    //Application.Run(new mytest());                //Application.Run(new XTGL.mdiLuxJieSuo());
                    ////Application.Run(new fmMain());
                }
                else
                {
                    //已经有一个实例在运行
                    HandleRunningInstance(instance);
                }                        //if (new test2().ShowDialog() == DialogResult.OK)
                //{
                //    Application.Run(new test2());
                //}
                //else
                //{
                //    return;
                //}        }        private static Process RunningInstance()
            {
                Process current = Process.GetCurrentProcess();
                Process[] processes = Process.GetProcessesByName(current.ProcessName);
                //遍历与当前进程名称相同的进程列表  
                foreach (Process process in processes)
                {
                    //如果实例已经存在则忽略当前进程  
                    if (process.Id != current.Id)
                    {
                        //保证要打开的进程同已经存在的进程来自同一文件路径
                        if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
                        {
                            //返回已经存在的进程                        return process;                    }
                    }
                }
                return null;
            }        private static void HandleRunningInstance(Process instance)
            {
                MessageBox.Show("已经在运行!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                ShowWindowAsync(instance.MainWindowHandle, 1);  //调用api函数,正常显示窗口            SetForegroundWindow(instance.MainWindowHandle); //将窗口放置最前端
            }
            [DllImport("User32.dll")]
            private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow);
            [DllImport("User32.dll")]
            private static extern bool SetForegroundWindow(System.IntPtr hWnd);    
        }
      

  2.   

    直接return挺干脆的啊,或者用Environment.Exit也能达到效果,实在想不通Main里面用能干嘛
      

  3.   

    http://www.cnblogs.com/zhouweiwei/archive/2009/11/30/1614025.htmlhttp://topic.csdn.net/u/20070826/17/926569BD-8E43-4BF9-A17E-01AD947003DE.html
      

  4.   

    并不是想知道exit和close的区别
      

  5.   

    我们就不适用EXIT,直接检测程序是否以运行,如果已运行,则直接RETURN
      

  6.   

    Application.Exit();是直接退出整个应用程序的吧  而return只是相对于某个窗体?
      

  7.   

    Application.Exit()是直接中止整个应用程序
      

  8.   


            static void Main()
            {
                if (DetchIfWMSRunning())
                {
                    Application.Exit();
                    return;// 加 return 则Running 不会显示
                }
               MessageBox.Show("Running!");
            }        static bool DetchIfWMSRunning()
            {
                string strAppPath  = Environment.CurrentDirectory + @"\";            Process currentProcess = Process.GetCurrentProcess();
                Process[] WMSProcesses = Process.GetProcessesByName(currentProcess.ProcessName);
                foreach (Process p in WMSProcesses)
                {
                    if ((p.Id != currentProcess.Id) && !System.IO.File.Exists(strAppPath + "Test.sln")) 
                    {
                        return true;
                    }
                }
                return false;
            }
      

  9.   

    请看MSDN的解释
    Exit 方法停止在所有线程上运行的所有消息循环,并关闭应用程序的所有窗口。该方法并不强制退出该应用程序。
      

  10.   

    网上很多例子都在Main()中调用了Application.Exit()
    如11楼举的例子
      

  11.   

    网上很多例子都在Main()中调用了Application.Exit() 
    如3楼和11楼的
      

  12.   

    Application.Exit:通知winform消息循环退出。会在所有前台线程退出后,退出应用强行退出方式,就像 Win32 的 PostQuitMessage()。它意味着放弃所有消息泵,展开调用堆栈,并将执行返回给系统 方法停止在所有线程上运行的所有消息循环,并关闭应用程序的所有窗口 Environment.Exit:立即终止当前进程,应用程序即强制退出。返回exitcode给操作系统,相比之下Environment.Exit更狠些 
      

  13.   

    那Main函数中基本还没开始处理什么,调用exit有什么意义呢
      

  14.   

    程序主函数return了也就是程序退出了。程序就是一个处理消息事件的循环,主函数看成个死循环。application.exit 应该是级别不对。不是给主函数用的吧。
      

  15.   

    我是这么做的 [STAThread]
    static void Main() 
    {
    bool bCreatedNewAdjust;
    Mutex mAdjust =new Mutex( false, "myUniqueName", out bCreatedNewAdjust );
    if( bCreatedNewAdjust )
    Application.Run(new frmAdjustMent());
    else
      MessageBox.Show("すでに起動しています。","仕入調整・返品",MessageBoxButtons.OK,MessageBoxIcon.Information);
    }
      

  16.   

    调用 Application.Exit() 并不一定能让程序立即退出,程序会等待所有的前台线程终止后才能真正退出。
      

  17.   

       在执行Application.Run方法之前查询Application.MessageLoop属性就可以发现此时程序根本就没有消息循环,此时也没有窗体出现,而Main()方法所处的线程是前台线程,所以Application.Exit() 这时既没有消息循环关闭,也因为有前台线程运行所以无法退出程序.
       我也觉得在Main()里面没有必要调用.有知道调用理由的说下啊
      

  18.   

    再等一天,难道Main里用exit是句废话??