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(控制调用者,委托方法,对象 [] 参数,布尔同步) 在 TSG.TransIT.UI
的 System.Windows.Forms.Control.Invoke(委托方法,对象 [] 参数)
.UIControls.ctGPViewTrip.updateTrip()
at TSG.TransIT.UI.UIControls.ctGPViewTrip.handleEditTrip(Object sender, EditTripAnnouncementEventArgs e)

4

1 回答 1

1

那里发生的事情是您正在手动调用多播委托。通常我不建议这样做(调用委托并让它担心所有这些要简单得多),但看起来你这样做是为了改进应用程序日志记录和错误处理。这可能有也可能没有充分的理由,所以我将把剩下的“只是调用它”演讲留到下一次。

这里的问题是,这听起来像是在与某些调用目标不同的线程上运行,这意味着当此代码使用特定目标调用委托时,该目标可能不再存在,或者被调用的对象需要代码可能不再存在。

于 2009-10-01T17:33:01.320 回答