C#如何实现进程单例运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#如何实现进程单例运行相关的知识,希望对你有一定的参考价值。

参考技术A 1,在program.cs文件中添加函数如下:

public static System.Diagnostics.Process RunningInstance()

System.Diagnostics.Process current = System.Diagnostics.Process.GetCurrentProcess();
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process process in processes) //查找相同名称的进程

if (process.Id != current.Id) //忽略当前进程
//确认相同进程的程序运行位置是否一样.
if (System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", @"\") == current.MainModule.FileName)
//Return the other process instance.
return process;


//No other instance was found, return null.
return null;


2,把Main ()函数改为如下代码:

static void Main()

if(RunningInstance()==null)

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());

else

MessageBox.Show("已经运行了一个实例了。");

C#中的单例实现问题

【中文标题】C#中的单例实现问题【英文标题】:singleton implementation problem in C# 【发布时间】:2011-04-11 16:08:13 【问题描述】:

--ConsoleApplication 1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2

    public class MsgService
    
        private static CreateConnectionToA _instanceA;
        private static CreateConnectionToB _instanceB;

        protected MsgService()
        

        

        public static MsgService GetInstanceA(string paramA, string paramB)
        

            if (_instanceA != null)
            
                return _instanceA;
            

            return _instanceA = new CreateConnectionToA("p1","p2");
        


        public static MsgService GetInstanceB(string paramA, string paramB)
        

            if (_instanceB != null)
            
                return _instanceB;
            

            return _instanceB = new CreateConnectionToB("p1", "p2");
        


    







using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2

    class CreateConnectionToB : MsgService
    
        public CreateConnectionToB(string param1, string Param2)
        

        
    



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2

    class CreateConnectionToA : MsgService
    
        public CreateConnectionToA(string param1, string Param2)
        

        

    



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2

    class Program
    
        static void Main(string[] args)
        

            MsgService.GetInstanceA("p1", "p2");

            Console.Read();
        
    

--ConsoleApplication 2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1

    class Program
    
        static void Main(string[] args)
        
            Console.WriteLine("Press");
            Console.Read();

            ConsoleApplication2.MsgService.GetInstanceA("p1", "p2");
            Console.Read();
        
    

我正在尝试进行 simgleton 实现,但我的方法有问题。它总是从每个控制台应用程序创建 _instanceA 和 _instanceB 的新实例。

有人可以指出这里需要做什么吗?

【问题讨论】:

【参考方案1】:

您需要命名互斥体来实现进程间同步。

【讨论】:

直截了当,是的。如果我们不受实现选择的限制,而只是尝试实现一个表现为单例的远程服务,我强烈建议查看 WCF(它有能力这样做)。 yoda.arachsys.com/csharp/singleton.html Jon Skeet 的单例是在它存在于一个进程中的前提下编写的。不过还是不错的。 请提供命名互斥锁的示例? @Asdfg:您能否准确描述您正在尝试做的事情,而不使用单例和文字服务这个词? 我正在尝试创建 _instanceA 和 _instanceB 的一个实例,无论调用如何。在 ConsoleApplication1 中,它工作正常,但在 ConsoleApplication2 中,空检查失败并创建新实例。我希望 _instanceA 和 _instanceB 在内存中。【参考方案2】:

在两个应用程序之间共享一个对象实例有点困难,因为默认情况下它们在不同的应用程序域中运行。要完成我认为您正在尝试做的事情,您需要要么

跨应用程序域边界封送,或 在共享的应用程序域中运行这两个进程。编写第三个进程——shell——负责在共享的应用程序域中生成/托管其他两个进程。

http://www.codeproject.com/KB/dotnet/AppDomainMemImprovement.aspx

Sharing data between AppDomains

【讨论】:

以上是关于C#如何实现进程单例运行的主要内容,如果未能解决你的问题,请参考以下文章

c#中sql-connection类上单例模式的实现

C#实现单例模式的几种方法

C# 单例表单模式,如何运行 2 个或更多表单? [关闭]

C#实现程序单例日志输出

c# 多线程运行时出现主界面卡死现象如何解决?

C#如何通过进程名称获取指定窗口的句柄,通过该句柄获取该窗口的标题?