我有拦截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,一切正常。
答案 0 :(得分:0)
嗯,从你给出的代码中我不是很清楚,但我想知道是不是因为你从未处理过你正在创建的SystemState
个对象。如果您在取消订阅时更改了代码以正确处置它们,那可能会有所帮助。
或者,不要费心继续创建新对象 - 只需预先创建三个对象,然后根据需要订阅/取消订阅。
答案 1 :(得分:0)
您不需要
stateTalking.Changed -= new ChangeEventHandler(stateTalking_Changed);
代码。首先,你没有删除你输入的同一个东西,你正在删除一个新的实例和ChangeVenetHandler。其次,运行
时会删除所有事件处理程序stateTalking = null;
因为Garage Collection。
正如Jon Skeet所说,你永远不会运行代码
stateTalking.Dispose();
删除之前。
答案 2 :(得分:0)
检查 if 语句。放置一个断点,并确保您甚至进入连接处理程序的条件。我怀疑你没有在后续调用中到达代码,可能是因为其中一个对象不是null。