0

我有用于拦截 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,一切正常。

4

3 回答 3

0

好吧,仅从您提供的代码中并不清楚,但我想知道这是否是因为您从未处理过SystemState您正在创建的对象。如果您在退订时更改代码以正确处理它们,这可能会有所帮助。

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

于 2010-11-26T14:21:08.587 回答
0

你不需要

stateTalking.Changed -= new ChangeEventHandler(stateTalking_Changed);

代码。首先,您并没有删除您放入的相同内容,而是删除了一个新实例,即 ChangeVenetHandler。其次,运行时所有事件处理程序都将被删除

stateTalking = null;

因为车库收藏。

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

stateTalking.Dispose();

在你删除它之前。

于 2010-11-26T14:28:43.357 回答
0

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

于 2010-11-26T14:28:55.280 回答