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