zoukankan      html  css  js  c++  java
  • C#实现单实例运行

    C#实现单实例运行的方法,也有多种,比如利用 Process 查找进程的方式,利用 API findwindow 查找窗体的方式,还有就是 利用 Mutex 原子操作,上面几种方法中, 综合考虑利用 Mutex 的方式是较好的选择。

    [STAThread]
    static void Main()
    {
        bool isAppRunning = false;
        System.Threading.Mutex mutex = new System.Threading.Mutex(
            true,
            System.Diagnostics.Process.GetCurrentProcess().ProcessName,
            out isAppRunning);
        if (!isAppRunning)
        {
            MessageBox.Show("本程序已经在运行了,请不要重复运行!");
            Environment.Exit(1);
        }
        else
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
     
    使用Process 查找进程的方式会报错:System.ComponentModel.Win32Exception 中第一次偶然出现的“System.dll”类型的异常
    原因可能是因为:
    有些进程,如:system 系统空闲进程,当前程序没有权限获取相关信息或有些程序没有process.MainModule.FileName这些属性
    示例代码:

               bool result = false;
                try
                {
                    Process me = Process.GetCurrentProcess();
                    Process[] us = Process.GetProcesses();
                    Process another = null;
                    foreach (var p in us)
                    {
                        try
                        {
                            if (p.Id != me.Id && p.MainModule.FileName == me.MainModule.FileName)
                            {
                                another = p;
                                break;
                            }
                        }
                        catch (Exception ex)
                        {
                            logger.Error(ex);
                        }
                    }
                    if (another != null)
                    {
                        MessageBox.Show("程序已运行", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Question);
                        result = true;
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.StackTrace+“
    ”+ e.Message);
                    result = true;
                }
                return result;
     
     
     
     
    http://xxinside.blogbus.com/logs/47162540.html
  • 相关阅读:
    今天上传公司服务器出现的.net framework版本错误问题
    浮动后父容器高度自适应
    asp net 编程问题 实现下一篇 和上一篇效果
    注意:"AspNetPager”的控件“AspNetPager1”必须放在具有 runat=server 的窗体标记内
    SqlDbHelper备份,做项目时方便应用(目前不太全,把自己项目中的逐渐转移过来)
    域名状态,域名查询看是否被注册
    关于403 由于扩展配置问题而无法提供您请求的页面的问题
    让qq图标在自己的网站上显示方法
    Tomcat基于虚拟路径的发布和web.xml配置
    Tomcat虚拟目录配置方法及原理
  • 原文地址:https://www.cnblogs.com/softidea/p/3324283.html
Copyright © 2011-2022 走看看