Проблема с обработчиком событий - PullRequest
0 голосов
/ 26 ноября 2010

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

Ниже приведен мой код:

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;
    }
}

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

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

Ответы [ 3 ]

0 голосов
/ 26 ноября 2010

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

stateTalking.Changed -= new ChangeEventHandler(stateTalking_Changed);

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

stateTalking = null;

из-за Garage Collection.

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

stateTalking.Dispose();

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

0 голосов
/ 26 ноября 2010

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

0 голосов
/ 26 ноября 2010

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

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

...