2009-10-01 10 views
0

J'essaie de comprendre ce que fait ce morceau de code. Il erreurs souvent (pas dans un système dommageable) mais assez que cela me dérange. Ce serait formidable si je pouvais obtenir plus d'informations sur ce qui se passe exactement ici et des suggestions sur la façon dont je pourrais résoudre/empêcher cela.VB.NET Clarification du code délégué

code

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 

Erreur commune

Message utilisateur: événement Async erreur d'incendie.
Type d'erreur: System.Reflection.TargetInvocationException
Message d'erreur: Une exception a été émise par la cible d'un appel.
Emplacement d'erreur: System.Reflection.TargetInvocationException: Une exception a été émise par la cible d'un appel. ---> System.NullReferenceException: Référence d'objet non définie sur une instance d'un objet.
à System.Windows.Forms.Control.MarshaledInvoke (l'appelant de contrôle, méthode délégué, Object [] args, synchrones booléen)
à System.Windows.Forms.Control.Invoke (méthode Delegate, Object [] args)
à TSG.TransIT.UI.UIControls.ctGPViewTrip.updateTrip()
à TSG.TransIT.UI.UIControls.ctGPViewTrip.handleEditTrip (sender d'objets, EditTripAnnouncementEventArgs e)

Répondre

1

Qu'est-ce qui se passe là-bas est que vous invoquez manuellement délégué multi-cast. Normalement, je ne le recommanderais pas (il est tellement plus simple d'invoquer le délégué et de le laisser s'inquiéter de tout cela), mais il semble que vous le fassiez pour améliorer la journalisation des applications et la gestion des erreurs. Il y a peut-être ou non une bonne raison à cela, et donc je vais laisser le reste de mon discours «juste l'invoquer» pour une autre fois. Le problème ici est qu'il semble que cela fonctionne sur un thread différent de certaines cibles d'invocation, ce qui signifie qu'au moment où ce code invoque le délégué avec une cible spécifique, cette cible pourrait ne plus exister, ou un objet requis par le code invoqué peut ne plus exister.