2015-01-15 3 views
-1

У меня есть класс A, который определяет событие, такое как публичное событие EventHandler OnCommandReply; У меня есть еще два класса, которые подписываются на это событие. Однако при запуске события это только один из классов, которые получают событие. Я хотел бы знать, как заставить обоих получать событие, которое уволено.C# Event Handlers Subscription Issue

Благодаря

+3

Вы уверены, что оба класса подписаны на мероприятие? Когда вы размещаете точки останова на соответствующих линиях, где происходит подписка, достигнуты ли они? –

+4

Не могли бы вы предоставить код? –

+0

Подписки были – Arsene

ответ

0

Если вы подписались на событие правильно, всегда и должны быть уволены. Вы уверены, что не отменили подписку на событие с -=? Или установите значение null?

Вы правильно подписались на свое событие с помощью +=?

Подписавшись

publisher.RaiseCustomEvent += HandleCustomEvent; 

отпиской:

publisher.RaiseCustomEvent -= HandleCustomEvent; 

Вот хорошая статья о том, что: How to: Subscribe to and Unsubscribe from Events (C# Programming Guide)

1

Я пытался воспроизвести вашу ошибку, но я не мог ... Это это то, что я пробовал:

public void Main() 
{ 
    var a = new A(); 

    var b = new B(); 
    var c = new C(); 

    a.SomethingChanged += b.OnSomethingChanged; 
    a.SomethingChanged += c.OnSomethingChanged; 

    a.RaiseSomethingChangedEvent(); 
} 

private class A 
{ 
    public event EventHandler SomethingChanged; 

    public void RaiseSomethingChangedEvent() 
    { 
    if(SomethingChanged !=null) 
     SomethingChanged(this, new EventArgs()); 
    } 
} 

private class B 
{ 
    public void OnSomethingChanged(object sender, EventArgs e) 
    { 
    Console.WriteLine("B: Event was raised."); 
    } 
} 

private class C 
{ 
    public void OnSomethingChanged(object sender, EventArgs e) 
    { 
    Console.WriteLine("C: Event was raised."); 
    } 
} 
+0

Что я сделал, так это то, что я подписываюсь на события, используя два экземпляра класса A. – Arsene

+0

Хорошо, но тогда оба экземпляра класса A должны поднять событие, чтобы уведомить всех слушателей или объявить событие как статическое – Chrisi

0

Убедитесь, что вы не используете оператор = при регистрации подписчика событий с издателем. Это приведет к замене всех/всех зарегистрированных в настоящее время подписчиков событий текущим абонентом. Вместо этого обязательно используйте оператор + =, чтобы заставить текущего подписчика присоединяться к списку вызовов обработчика события.