using System.Threading.Tasks;
public static void Main()
Publisher youtube = new Publisher("Youtube.Com", 2000);
Publisher facebook = new Publisher("Facebook.com", 1000);
Subscriber sub1 = new Subscriber("Florin");
Subscriber sub2 = new Subscriber("Piagio");
Subscriber sub3 = new Subscriber("Shawn");
sub1.Subscribe(facebook);
sub3.Subscribe(facebook);
Task task1 = Task.Factory.StartNew(() => youtube.Publish());
Task task2 = Task.Factory.StartNew(() => facebook.Publish());
Task.WaitAll(task1, task2);
public class NotificationEvent{
public string NotificationMessage { get; private set; }
public DateTime NotificationDate { get; private set; }
public NotificationEvent(DateTime _dateTime, string _message)
NotificationDate = _dateTime;
NotificationMessage = _message;
public string PublisherName { get; private set; }
public int NotificationInterval { get; private set; }
public delegate void Notify(Publisher p, NotificationEvent e);
public event Notify OnPublish;
public Publisher(string _publisherName, int _notificationInterval){
PublisherName = _publisherName;
NotificationInterval = _notificationInterval;
Thread.Sleep(NotificationInterval);
NotificationEvent notificationObj = new NotificationEvent(DateTime.Now, "New Notification Arrived from");
OnPublish(this, notificationObj);
public string SubscriberName { get; private set; }
public Subscriber(string _subscriberName){
SubscriberName = _subscriberName;
public void Subscribe(Publisher p){
p.OnPublish += OnNotificationReceived;
public void Unsubscribe(Publisher p){
p.OnPublish -= OnNotificationReceived;
protected virtual void OnNotificationReceived(Publisher p, NotificationEvent e){
Console.WriteLine("Hey " + SubscriberName + ", " + e.NotificationMessage +" - "+ p.PublisherName + " at " + e.NotificationDate);