2015-01-28 5 views
0

У меня есть класс издателя и класс подписчика. Класс publisher имеет событие, и подписчик хочет выполнить один из своих методов, когда это событие будет поднято.C# Обработка событий с использованием подписчика издателя не работает

Вот мой издатель класс с событием:

public delegate EventHandler<MyEventArgs> MyEventHandler(object sender, MyEventArgs args); 
public class MyEventArgs : EventArgs 
{ 
    public string Content { set; get; } 
} 

public class Publisher 
{ 
    public event MyEventHandler MyCustomEvent; 

    public void TriggerEvent() 
    { 
     if(MyCustomEvent!=null) 
      MyCustomEvent(this, new MyEventArgs{ Content = "Geeee! This isn't working!" }); 
    } 
} 

А вот абонент:

class Subscriber 
{ 
    static void Main(string[] args) 
    { 
     Publisher publisher = new Publisher(); 

     //hook the event to a method 
     publisher.MyCustomEvent += (s, e) => delegate 
     { 
      PrintThis(e.Content); 
     }; 

     //Do something to trigger the event  
     publisher.TriggerEvent(); 
    } 
    static public void PrintThis(string content) 
    { 
     Console.Write(content); 
    } 
} 

Издатель не должен быть в курсе абонента. Я хочу, чтобы подписчик мог выполнять свою функцию PrintThis, когда издатель вызывает событие. Но это не работает. Что я здесь делаю неправильно?

+1

Что не работает? – Enigmativity

+0

Контрольная точка при функции PrintThis никогда не попадает. На консоли ничего не печатается. – user3655614

ответ

0

Вы не определили обработчик событий.

Делают это так:

public delegate void MyEventHandler(object sender, MyEventArgs args); 

Обратите внимание, что тип возвращаемого значения void.

А потом сам обработчик события должен быть:

publisher.MyCustomEvent += (s, e) => 
    { 
     PrintThis(e.Content); 
    }; 

Кроме того, ваш метод TriggerEvent безопаснее, если они определены таким образом:

public void TriggerEvent() 
{ 
    var mce = MyCustomEvent; 
    if (mce!=null) 
    { 
     mce(this, new MyEventArgs{ Content = "Geeee! This isn't working!" }); 
    } 
} 

В многопоточной среде MyCustomEvent обработчик может переключаться между null проверить и вызвать.

+0

О, это работает! Спасибо тонну :) В чем была разница? Я имею в виду, что компилятор не выдавал синтаксической ошибки. – user3655614

+0

Компилятор довольно мягкий, когда дело доходит до кастинга от одного делегата к другому, если вы явно передаете его как делегат (который вы сделали). Если вы вытащили только ключевое слово 'delegate', вы бы увидели сообщение об ошибке. – Enigmativity

+0

в порядке. Узнал что-то новое :) Спасибо – user3655614

Смежные вопросы