2010-11-26 5 views
0

У меня есть обработчики событий для перехвата журналов вызовов на мобильных устройствах Windows. Проблема более специфична для обработчиков событий в C#, а не для мобильных устройств Windows. Я могу подключать и отключать обработчики событий в первый раз. Пробел: Я не могу подключить обработчик событий после его отсоединения хотя бы один раз. Почему обработчики событий не вызываются после его отсоединения и снова прикрепляются?Проблема обработчика событий

Ниже мой код:

private static SystemState stateIncoming = null; 
private static SystemState stateOutgoing = null; 
private static SystemState stateTalking = null; 


public static void StartCallLogInterception() 

{ 

    if (stateIncoming == null && stateOutgoing == null && stateTalking == null) 
    { 
     stateIncoming = new SystemState(SystemProperty.PhoneIncomingCall); 
     stateIncoming.Changed += new ChangeEventHandler(stateIncoming_Changed); 

     stateOutgoing = new SystemState(SystemProperty.PhoneCallCalling); 
     stateOutgoing.Changed += new ChangeEventHandler(stateOutgoing_Changed); 

     stateTalking = new SystemState(SystemProperty.PhoneCallTalking); 
     stateTalking.Changed += new ChangeEventHandler(stateTalking_Changed); 
    } 
} 

public static void EndCallLogInterception() 

{ 

    if (stateIncoming != null && stateOutgoing != null && stateTalking != null) 
    { 
     stateIncoming.Changed -= new ChangeEventHandler(stateIncoming_Changed); 
     stateIncoming = null; 

     stateOutgoing.Changed -= new ChangeEventHandler(stateOutgoing_Changed); 
     stateOutgoing = null; 

     stateTalking.Changed -= new ChangeEventHandler(stateTalking_Changed); 
     stateTalking = null; 
    } 
} 

EDIT: Я обновил код, чтобы включить переменный уровень класса. Кроме того, ниже ответы конфликтуют друг с другом. Если я удаляю объект, я должен повторно создать объект, когда мне нужно присоединить обработчик событий. Имеет ли это смысл?

РЕДАКТИРОВАТЬ 2: Проблема связана не с объектами или кодом обработки событий. Я использую LargeIntervalTimer из OpenNETCF. Всякий раз, когда я запускаю таймер с использованием LargeIntervalTimer, обработчик событий не подключен должным образом. Без LargeIntervalTimer все работает нормально.

+2

Я подозреваю, что ваша проблема - это что-то еще. В C# нет ограничений на то, сколько раз вы можете прикреплять и отделять обработчики событий. Возможно, добавьте еще какой-нибудь код и какие точные проблемы у вас есть ... – BFree 2010-11-26 14:21:16

ответ

0

Ну, это не совсем понятно из кода, который вы указали, но мне интересно, не потому ли, что вы никогда не удаляете создаваемые объекты SystemState. Если вы измените свой код, чтобы правильно распоряжаться им, когда вы отмените подписку, это может помочь.

В качестве альтернативы, не беспокойтесь о том, чтобы создавать новые объекты - просто создайте три объекта вверх, а затем подпишитесь/отмените подписку по мере необходимости.

+0

Если я вызываю Dispose на объект, я должен повторно создать объект, когда мне нужно прикрепить событие к объекту. Это правильно? – 2010-11-29 04:11:52

+0

Объекты SystemState - это объекты уровня класса. Как я их распоряжусь? – 2010-11-29 04:13:38

0

Вам не нужен код

stateTalking.Changed -= new ChangeEventHandler(stateTalking_Changed); 

. Во-первых, вы не удаляете то же самое, что и вы, вы удаляете новый экземпляр объекта ChangeVenetHandler. Во-вторых, все обработчики событий удаляются при запуске

stateTalking = null; 

из-за коллекции гаража.

Как сказал Джон Скит, вы никогда не запускать код

stateTalking.Dispose(); 

, прежде чем удалить его.

0

Проверьте , если утверждений. Поместите точку останова и убедитесь, что вы даже ввели условие, связанное с обработкой обработчиков. Я подозреваю, что вы не достигли кода в последующих вызовах, вероятно, потому, что один из объектов не является нулевым.

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