VB.NET委托代码澄清

时间:2009-10-01 16:49:22

标签: vb.net delegates clarity

我试图找出这段代码的作用。它经常出错(不是以系统破坏的方式)但足以让我烦恼。如果我能够获得有关这里究竟发生了什么的更多信息以及关于我如何能够解决/阻止这种情况的任何建议,那将是很好的。

代码

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

1 个答案:

答案 0 :(得分:1)

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

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