0

Windows Mobile で通話ログをインターセプトするためのイベント ハンドラーがあります。この問題は、Windows モバイルではなく、C# のイベント ハンドラーに固有のものです。初めてイベント ハンドラーをアタッチおよびデタッチできます。問題は次のとおりです。イベント ハンドラーを少なくとも 1 回切り離した後、イベント ハンドラーをアタッチできません。デタッチされて再度アタッチされた後、イベント ハンドラーが呼び出されないのはなぜですか?

以下は私のコードです:

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まあ、あなたが与えたコードだけでははっきりしていませんが、作成しているオブジェクトを決して処分していないからなのだろうか. 購読を解除するときにコードを適切に破棄するように変更すると、役立つ場合があります。

または、わざわざ新しいオブジェクトを作成し続ける必要はありません。最初に 3 つのオブジェクトを作成し、必要に応じて購読/購読解除してください。

于 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ステートメントを確認してください。ブレークポイントを配置し、ハンドラーを接続する条件に入っていることを確認してください。おそらくオブジェクトの 1 つが null ではないため、後続の呼び出しでコードに到達していないと思われます。

于 2010-11-26T14:28:55.280 に答える