C#中的单例实现问题

时间:2011-04-11 16:08:14

标签: c# .net singleton interprocess

- 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的新实例。

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

2 个答案:

答案 0 :(得分:3)

您需要使用命名的互斥锁进行进程间同步。

答案 1 :(得分:0)

在两个应用程序之间共享对象实例有点困难,因为默认情况下它们在单独的应用程序域中运行。要完成我认为你想要做的事情,你需要

  • 跨越appdomain边界编组,或
  • 在共享的appdomain中运行这两个进程。编写第三个进程 - 一个shell - 负责在共享的appdomain中生成/托管其他两个进程。

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

Sharing data between AppDomains