事件处理程序问题

时间:2010-11-26 14:17:38

标签: c# events windows-mobile event-handling opennetcf

我有拦截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:问题不在于对象或事件处理代码。我正在使用OpenNETCF的LargeIntervalTimer。每当我使用LargeIntervalTimer运行计时器时,事件处理程序都没有正确连接。没有LargeIntervalTimer,一切正常。

3 个答案:

答案 0 :(得分:0)

嗯,从你给出的代码中我不是很清楚,但我想知道是不是因为你从未处理过你正在创建的SystemState个对象。如果您在取消订阅时更改了代码以正确处置它们,那可能会有所帮助。

或者,不要费心继续创建新对象 - 只需预先创建三个对象,然后根据需要订阅/取消订阅。

答案 1 :(得分:0)

您不需要

stateTalking.Changed -= new ChangeEventHandler(stateTalking_Changed);

代码。首先,你没有删除你输入的同一个东西,你正在删除一个新的实例和ChangeVenetHandler。其次,运行

时会删除所有事件处理程序
stateTalking = null;

因为Garage Collection。

正如Jon Skeet所说,你永远不会运行代码

stateTalking.Dispose();
删除之前

答案 2 :(得分:0)

检查 if 语句。放置一个断点,并确保您甚至进入连接处理程序的条件。我怀疑你没有在后续调用中到达代码,可能是因为其中一个对象不是null。