2016-09-23 3 views
1

Avant C# 6, j'utilisait cette routine pour faire face à générer des événements dans un programme multithread: (je l'ai trouvé quelque part, mais ne se souvient pas où):C# Création de l'événement: Raise vs invoquez

public static object Raise(this MulticastDelegate multicastDelegate, object sender, EventArgs e) 
    { 
     object retVal = null; 

     MulticastDelegate threadSafeMulticastDelegate = multicastDelegate; 
     if (threadSafeMulticastDelegate != null) 
     { 
      foreach (Delegate d in threadSafeMulticastDelegate.GetInvocationList()) 
      { 
       var synchronizeInvoke = d.Target as ISynchronizeInvoke; 
       if ((synchronizeInvoke != null) && synchronizeInvoke.InvokeRequired) 
        retVal = synchronizeInvoke.EndInvoke(synchronizeInvoke.BeginInvoke(d, new[] { sender, e })); 
       else 
        retVal = d.DynamicInvoke(sender, e); 
      } 
     } 
     return retVal; 
    } 

donc tout ce que je devais faire était Eventname.Raise (..., ....)

maintenant avec C# 6, je sais que la nouvelle était en utilisant quelque chose comme: eVENTNAME .invoke (.. .); Ce que je me demande, est-ce que je me demande, devrais-je changer toutes mes créations d'événement à invoquer comme cela fonctionne différent à l'augmenter(), ou est-ce la même chose?

Répondre

3

Vous n'auriez jamais dû utiliser cette méthode en premier lieu. C'est trop compliqué. Au lieu de cela, quelque chose comme ça aurait été mieux:

public static void Raise(this Delegate handler, object sender, EventArgs e) 
{ 
    if (handler != null) 
    { 
     handler.DynamicInvoke(sender, e); 
    } 
} 

Comme si vous deviez changer votre code d'événement, je dirais non. Pas à moins que vous ayez beaucoup de temps à tuer et que vous ayez à passer par toute votre base de code en remplaçant parfaitement le bon code.

Qu'est-ce que devrait faire est de corriger votre actuelle Raise() méthode. Et se sentir libre pour tout nouveau code pour l'écrire le nouveau chemin C# 6, c'est-à-dire MyEvent?.DynamicInvoke(this, EventArgs.Empty) (ce qui revient exactement à la même chose que MyEvent.Raise(this, EventArgs.Empty) en utilisant ce qui précède, sauf sans l'appel de méthode supplémentaire).

+0

Merci pour le commentaire. Je vais changer le code Raise(). Merci pour l'aide. – Tony