2009-10-01 191 views
0

我想弄清楚这段代码的作用。它经常出错(不是以破坏系统的方式),但足以让我困扰。如果我能够获得关于这里究竟发生了什么的更多信息以及关于如何修复/防止这种情况的任何建议,那将是非常好的。VB.NET委托代码澄清

代码

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(控制呼叫者,委派方法,对象[]指定参数时,布尔同步)
在System.Windows.Forms.Control.Invoke(委托方法,对象[]参数)
在TSG.TransIT.UI.UIControls.ctGPViewTrip.updateTrip()
在TSG.TransIT.UI.UIControls.ctGPViewTrip.handleEditTrip(对象发件人,EditTripAnnouncementEventArgs E)

回答

1

这是怎么回事还有就是你手动调用多播代表。通常我不会推荐(只是调用委托并让它担心所有这些变得更简单),但它看起来像是在改进应用程序日志记录和错误处理。这可能有也可能没有一个好的理由,所以我会把剩余的“只是调用它”的演讲留下来。

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