0

私はこのコードが何をするのかを理解しようとしています。エラーが頻繁に発生しますが(システムに損傷を与えるような方法ではありません)、気になるほどで​​す。ここで何が起こっているのかについての詳細情報と、これを修正/防止する方法についての提案を得ることができれば素晴らしいと思います。

コード

Public Shared Sub Fire(ByVal thisEvent As [Delegate], _
    ByVal ParamArray args() As Object)

    If (thisEvent Is Nothing) Then
        Exit Sub
    End If

    Dim delegates() As [Delegate] = thisEvent.GetInvocationList()

    For Each synch As [Delegate] In delegates
        Try
            synch.DynamicInvoke(args)
        Catch ex As System.Exception
            Util.utEmail.SendErrorMail("Async event fire error.", ex) //Email out error
        End Try
    Next
End Sub

一般的なエラー

ユーザーメッセージ:非同期イベント起動エラー。
エラータイプ:System.Reflection.TargetInvocationException
エラーメッセージ:呼び出しのターゲットによって例外がスローされました。
エラーの場所:System.Reflection.TargetInvocationException:呼び出しのターゲットによって例外がスローされました。---> System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。
System.Windows.Forms.Control.MarshaledInvoke(コントロール呼び出し元、デリゲートメソッド、Object [] args、ブール同期)
at System.Windows.Forms.Control.Invoke(デリゲートメソッド、Object [] args)
at TSG.TransIT.UI .UIControls.ctGPViewTrip.updateTrip()
at TSG.TransIT.UI.UIControls.ctGPViewTrip.handleEditTrip(Object sender、EditTripAnnouncementEventArgs e)

4

1 に答える 1

1

そこで起こっているのは、マルチキャストデリゲートを手動で呼び出しているということです。通常はお勧めしませんが(デリゲートを呼び出してすべてを心配させる方がはるかに簡単です)、アプリケーションのロギングとエラー処理を改善するために行っているようです。それには正当な理由があるかもしれないし、ないかもしれないので、残りの「ただそれを呼び出す」スピーチは別の機会に残しておきます。

ここでの問題は、これが一部の呼び出しターゲットとは異なるスレッドで実行されているように聞こえることです。つまり、このコードが特定のターゲットでデリゲートを呼び出すまでに、そのターゲットは存在しない可能性があるか、呼び出されたオブジェクトに必要なオブジェクトが呼び出されます。コードが存在しない可能性があります。

于 2009-10-01T17:33:01.320 に答える