Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 事件处理程序问题_C#_Events_Windows Mobile_Event Handling_Opennetcf - Fatal编程技术网

C# 事件处理程序问题

C# 事件处理程序问题,c#,events,windows-mobile,event-handling,opennetcf,C#,Events,Windows Mobile,Event Handling,Opennetcf,我有用于拦截windows mobile上的呼叫日志的事件处理程序。问题更多地针对C#中的事件处理程序,而不是windows mobile。我第一次能够附加和分离事件处理程序。问题是:我无法在事件处理程序分离后至少附加一次。为什么在事件处理程序分离并再次附加后不调用事件处理程序 下面是我的代码: private static SystemState stateIncoming = null; private static SystemState stateOutgoing = null; pri

我有用于拦截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运行计时器时,事件处理程序未正确连接。如果没有大的IntervalTimer,一切都可以正常工作。

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

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

您不需要

stateTalking.Changed -= new ChangeEventHandler(stateTalking_Changed);
代码。首先,您并不是在删除放入的相同内容,而是在删除ChangeVenetHandler的一个新实例。其次,运行时将删除所有事件处理程序

stateTalking = null;
因为车库的收藏

正如Jon Skeet所说,您从未运行过代码

stateTalking.Dispose();

在删除它之前。

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

我怀疑您的问题是其他问题。在C中,可以附加和分离事件处理程序的次数没有限制。可能会发布更多的代码,你遇到的确切问题是什么……我正在达到这个条件。在删除if条件后,我也尝试过。如果我调用对象上的Dispose,我必须在需要将事件附加到对象时重新创建该对象。是这样吗?SystemState对象是类级对象。我将如何处理它们?@让我问一下:在将变量设置为null之前,您只需对它们调用dispose。