如何让程序只在内存中执行一个

在WinForm或者Console程序中,可以通过可以遍历所有现在正在执行的进程,如果有同名的进程存在,那么说明这个程序已经启动了一个了,此处就不再启动了。如果没有同名进程的存在,说明这个程序还没有启动过,此时我们可以启动一个。

    public static void Main()
    {
	            string strModuleName = System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName;
	            string strProcName = System.IO.Path.GetFileNameWithoutExtension(strModuleName);

	            // Check if application is running allready, if so do nothing just end.
	             if ((!(System.Diagnostics.Process.GetProcessesByName(strProcName).Length > 1)))
	             {
		                 //启动程序
		                 Application.EnableVisualStyles();
                          Application.SetCompatibleTextRenderingDefault(false);
                          Application.Run(new Form1());
	             }
    }

或者使用Mutex方式。Mutex是C#自带的一个类,通过下边的代码,可以直接达到想要的效果。

    static void Main()
    {
        bool createNew;
        try
        {
            using (System.Threading.Mutex m = new System.Threading.Mutex(true, "Global\\" + 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!");
                }
        }
    }
    catch
    {
        MessageBox.Show("Only one instance of this application is allowed!");
    }
}            

在Windows Service中,因为是以服务的形式存在,一个服务只能启动一次,不像WinForm程序,WinForm在不同的时间点击多次就会尝试启动多个,Windows Service不会。但是这里也有一种情况,就是Windows Service会涉及到一个定时任务的问题。会使用一个Timer,让其在指定的时间间隔内执行某个方法。比如说,这个windows service设定的是每10分钟执行一次方法A,但是有时候因为网络问题,方法A执行的比较慢,10分钟之内并没有执行完毕。但是此时又达到了Timer的时间间隔设定值,Timer就会再次启动一个线程来执行这个方法,此时如果A方法同时被两个线程执行的话,就会有问题。所以,我们也要防止同一时间内一个方法被多个线程执行。

先检查一下这个进程有没有已经存在,如果已经存在,那么就不再开启一个新的进程。

        private object _lockFlag = new object();
        private System.Timers.Timer _timer = null;
        private bool _threadIsRunning = false;
        private ServiceManager _manager = new ServiceManager();

        //因为同时会有多个线程来访问这个变量,所以给这个变量进行了加锁操作。
        private bool ThreadIsRunning
        {
            get
            {
                lock (this._lockFlag) { return this._threadIsRunning; }
            }
            set
            {
                lock (this._lockFlag) { this._threadIsRunning = value; }
            }
        }

	 //因为Windows Service要进行计划任务,所以就使用了Timer
        private void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (this.ThreadIsRunning)
                return;

            this.ThreadIsRunning = true;

	    //这个就是上边说到的A方法,里边包含的是windows service的主要操作逻辑。如果不采取措施的话,可能同时被多个Timer启动的线程执行
            this._manager.Excecute();
            this.ThreadIsRunning = false;
        }

        protected override void OnStart(string[] args)
        {
            try
            {
                Log.Info("service is starting.");

                this._timer = new System.Timers.Timer(100000);
                this._timer.Enabled = true;
                this._timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
                this._timer.Start();
            }
            catch (Exception ex)
            {
                Log.Error(ex);
            }
        }

如何让程序只在内存中执行一个

时间: 2024-11-03 21:18:54

如何让程序只在内存中执行一个的相关文章

【翻译】Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解)

[翻译]Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解) . . .

Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解)

(进程的虚拟存储器映像布局详解) 前言:原文来自于http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/ 这里只是对其进行翻译,并且重构了原文中的图片.译注则是我增加的内容,用来解释原文或提出问题:由于个人水平有限,译文和译注中的错误之处还请广大坛友提出指正,不胜感激. 下面采用分段中英对照的方式列出内容: Memory management is the heart of operating systems; i

VS2013+win8编写的C++程序在xp/win7中执行

使用Visual Studio 2013在Windows 8下编写的C++程序在Windows XP系统执行错误,报错信息为:"不是有效的win32应用程序". 在Windows 7报错信息例如以下图. 解决方法: 依照例如以下步骤操作就可以解决. 第一步:打开project的属性.点击[配置属性]->[常规]->[平台工具集],选择"Visual Studio 2013 - Windows XP (v120_xp)",例如以下图. * 假设你的程序为M

目的:让目标程序在内存中只有一个实例

Q:为什么要实现这个目的?? A:因为有些程序 需要使用电脑上面的硬件,比如串口 采集卡之类的.这样情况下,程序在内存里面就只能 有一份,不然会抢夺硬件资源,造成各种问题. ×××××××××××××××××××××× 实现这个目的可能有很多种方式.不过此处我要使用的是CreateMutex()这个函数. 这个函数被定义在Kernel32里面.这个中文意译就是创建一个互锁. 函数原型: HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttrib

如何在linux中执行一个脚本

---恢复内容开始--- 如何在LINUX中在系统启动时自动执行一个执行脚本 如果是开机马上执行的脚本,可以将脚本写到rc.local中: 如果是用户登录后自动执行脚本,可以将脚本写到相应的用户目录下"-/.bash_profile",若脚本"-/.bash_profile"不存在,可以直接拷贝"/etc/profile"命名为"-/.bash_profile": 如果是要任一用户登录后自动执行脚本,可以将脚本写到"

java中的各种数据类型在内存中存储的方式

1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆(Heap)中分配空间.释放:对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作.但同时,它也加重了JVM的工作.因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请.引用.被引用.赋值等,GC都需要进行监控. 2.什么叫java的内存泄露 在j

SQL Server 2014新功能 -- 内存中OLTP(In-Memory OLTP)

SQL Server 2014新功能 -- 内存中OLTP(In-Memory OLTP) 概述 内存中OLTP(项目"Hekaton")是一个全新的.完全集成到SQL Server的数据库引擎组件. 对OLTP工作负载访问中在内存中的数据进行了优化.内存中OLTP能够帮助OLTP工作负载实现显著的性能改善,并减少处理时间.表能被视为"内存优化",提升内存中的OLTP功能.内存优化表是完全可事务的.并可以使用Transact-SQL进行访问.Transact-SQL

SQL Server 内存中OLTP内部机制概述(二)

----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory OLTP Internals Overview>:http://technet.microsoft.com/en-us/library/dn720242.aspx 译者水平有限,如有翻译不当之处,欢迎指正. ----------------------------我是分割线---------------

模拟在内存中的数据库DataSet相关的类

这篇连着上一篇DataReader相关类. 下面两段话是在msdn官网摘下来:       .NET Framework 数据提供程序是专门为数据操作以及快速.只进.只读访问数据而设计的组件.Connection 对象提供到数据源的连接. 使用 Command 对象可以访问用于返回数据.修改数据.运行存储过程以及发送或检索参数信息的数据库命令. DataReader 可从数据源提供高性能的数据流. 最后,DataAdapter 在 DataSet 对象和数据源之间起到桥梁作用. DataAdap