0

アプリケーションにこのコードがあります

If _oCurrentCall.CustomData.Length > 0 AndAlso UsageType = UsageTypeEnum.Vanlig Then
  RaiseEvent NewIncomingCallWithCustomData(_oCurrentCall)
ElseIf UsageType = UsageTypeEnum.Sentralbord Then
  RaiseEvent NewIncomingCall(_oCurrentCall, Queues)
End If

デバッグしなくても、イベントは正常に発生し、機能しています。ただし、実行ステップを他の条件ブロックの raiseevent にドラッグするなど、実行ステップをデバッグして変更しようとすると、イベントは発生しません。

私は何を間違っていますか?

4

1 に答える 1

2

私は再現します。これは間違いなくデバッガーのバグであり、修正するのは非常に難しいようです。コードをvb.netからC#に逆コンパイルすると見やすくなります。このサンプルコード:

Class Test
    Public Event Foo As EventHandler
    Public Event Bar As EventHandler

    Public Sub Run(ByVal arg As Integer)
        If arg = 0 Then
            RaiseEvent Foo(Me, EventArgs.Empty)
        Else
            RaiseEvent Bar(Me, EventArgs.Empty)
        End If
    End Sub
End Class

この同等のC#コードに変換されます:

public void Run(int arg)
{
    EventHandler VB$t_ref$S0;
    if (arg == 0)
    {
        VB$t_ref$S0 = this.FooEvent;
        if (VB$t_ref$S0 != null)
        {
            VB$t_ref$S0(this, EventArgs.Empty);
        }
    }
    else
    {
        VB$t_ref$S0 = this.BarEvent;
        if (VB$t_ref$S0 != null)              // <=== HERE!!!
        {
            VB$t_ref$S0(this, EventArgs.Empty);
        }
    }
}

Set Next Statementデバッガコマンドを使用して実行ポイントを2番目のRaiseEventステートメントに設定すると、デバッガは実行ポイントを上記のスニペットでHEREでマークされたステートメントに移動します。一時変数の初期化をバイパスします。これはまだnullなので、イベントは発生しません。コマンドを使用した後、デバッグ+ Windows +逆アセンブリを使用してマシンコードを確認することで、これが発生していることを確認できます。

それ以外の点では、これはC#プログラマーに非常によく知られているまったく同じ種類のイベント発生コードであり、発生イベントアクセサーがないため、次のように記述する必要があります。

var temp = Bar;
if (temp != null) {
    Bar(this, EventArgs.Empty);
}

さて、デバッガーはこれをいじくり回します、それがどのように起こり得るかを見るのは簡単です。そして、それが長い間検出されなかった(または無視された)状態が続いた可能性があります。回避策を見つけるのは困難です。RaiseEventステートメントの前のステートメントは機能しますが、非常に実用的ではありません。Ifステートメントが目的のイベントを実行するように変数を変更することが可能です。

私はconnect.microsoft.comで問題を報告しました、フィードバック記事はここにあります。奇跡を期待しないでください。

于 2012-06-20T11:58:27.813 に答える