C#中的单例实现问题

Posted

技术标签:

【中文标题】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#中的单例实现问题的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D中的单例模式

Go中的单例实现

C# 两行代码实现 延迟加载的单例模式(线程安全)

C#中各版本的单例模式

Python中的单例模式

Python中的单例模式——装饰器实现剖析