2015-04-28 168 views
0

我是C#编程的初学者。
当我运行这个程序,命名为事件处理程序 - newMessagePublishedEventHandlerMessagePool的总是空的同时执行同一类的OnNewMessagePublished()功能。
任何人都可以请告诉我为什么?还有我怎么解决这个问题?C#事件处理 - 事件处理程序保留为空

namespace ConsoleApp 
{ 
public class MessageEventArgs : System.EventArgs 
{ 
    private int publisherId; 
    private string message; 

    public MessageEventArgs(int publisherId, string messageText) 
    { 
     this.publisherId = publisherId; 
     this.message = messageText; 
    } 

    public int PublisherId 
    { 
     get { return publisherId; } 
    } 

    public string Message 
    { 
     get { return message; } 
    } 
} 

public class Publisher 
{ 
    private int publisherId; 

    public Publisher(int publisherId) 
    { 
     this.publisherId = publisherId; 
    } 

    public int PublisherId 
    { 
     get { return publisherId; } 
    } 

    public void Publish(string message) 
    { 
     MessagePool.GetInstance().Publisher_PostMessage(this.publisherId, message); 
     Console.WriteLine("published message - " + message); 
    } 
} 

public class MessagePool 
{ 
    private static MessagePool theOnlyInstanceOfMessageBroker; 

    public static MessagePool GetInstance() 
    { 
     if (theOnlyInstanceOfMessageBroker == null) 
     { 
      return new MessagePool(); 
     } 
     else 
     { 
      return theOnlyInstanceOfMessageBroker; 
     } 
    } 

    private MessagePool() 
    { 
    } 

    private EventHandler newMessagePublishedEventHandler; 

    public event EventHandler NewMessagePublished 
    { 
     add 
     { 
      newMessagePublishedEventHandler += value; 
     } 

     remove 
     { 
      newMessagePublishedEventHandler -= value; 
     } 
    } 

    public void Publisher_PostMessage(int publisherId, string message) 
    { 
     DateTime publishedTime = DateTime.Now; 
     this.OnNewMessagePublished(publisherId, message); 
    } 

    private void OnNewMessagePublished(int publisherId, string message) 
    { 
     MessageEventArgs eventArgs = new MessageEventArgs(publisherId, message); 
     if (newMessagePublishedEventHandler != null) 
     { 
      newMessagePublishedEventHandler(this, eventArgs); 
     } 
    } 
} 

public class Subscriber 
{ 
    private int subscriberId; 

    public Subscriber(int subscriberId) 
    { 
     this.subscriberId = subscriberId; 
     this.SubscribeToMessagebroker(); 
    } 

    public int SubscriberId 
    { 
     get { return subscriberId; } 
    } 

    private void SubscribeToMessagebroker() 
    { 
     MessagePool.GetInstance().NewMessagePublished -= Subscriber_NewMessageArrived; 
     MessagePool.GetInstance().NewMessagePublished += Subscriber_NewMessageArrived; 
    } 

    private void Subscriber_NewMessageArrived(object sender, EventArgs eventArgs) 
    { 
     if (eventArgs != null && eventArgs is MessageEventArgs) 
     { 
      var data = eventArgs as MessageEventArgs; 
      if (data != null) 
       Console.WriteLine("Recieved message : '" + data.Message + "' from " + data.PublisherId); 
     } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Subscriber subscriber = new Subscriber(1); 
     Publisher publisher = new Publisher(1001); 
     publisher.Publish("Hey man.. whats up?"); 
     Console.ReadLine(); 
    } 
} 
} 

回答

0

MessagePool不是一个适当的辛格尔顿,你总是返回一个新MessagePool

public class MessagePool 
    { 
     private static MessagePool theOnlyInstanceOfMessageBroker; 
     private static object _syncRoot = new object(); 

     public static MessagePool GetInstance() 
     { 
      if (theOnlyInstanceOfMessageBroker == null) 
      { 
       lock(_syncRoot) 
       { 
        if (theOnlyInstanceOfMessageBroker == null) 
         theOnlyInstanceOfMessageBroker = new MessagePool(); 
       } 
      } 

      return theOnlyInstanceOfMessageBroker; 

     } 

     private MessagePool() 
     { 
     } 

//... 
} 
+0

或者只是'返回theOnlyInstanceOfMessageBroker ?? ?? (theOnlyInstanceOfMessageBroker =新MessagePool())' – stuartd

+0

是,将工作,但因为他是新的C#我会避免合并操作:) –

+0

你单身的实现也没有线程安全的。 – Servy