2015-04-28 218 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