81 votes

Plus propre façon d’appeler les événements inter-threads

Je trouve que le modèle d’événement .NET est telle que je vais souvent déclenchement d’un événement sur un thread et il écoute sur un autre thread. Je me demandais quel est le moyen le plus propre pour marshaler un événement à partir d’un thread d’arrière-plan sur mon thread d’interface utilisateur.

Se fondant sur les propositions de la communauté, j’ai utilisé ceci :

45voto

Domenic Points 40761

J’ai un code pour cela en ligne. Il est beaucoup plus agréable que les autres suggestions ; certainement, vérifiez-le dehors.

Exemple d’utilisation :

28voto

Shaun Austin Points 2512

Quelques observations:

  • Ne créez pas de simples délégués explicitement dans le code comme ça, sauf si vous êtes pré-2.0 afin que vous pouvez utiliser:
   BeginInvoke(new EventHandler<CoolObjectEventArgs>(mCoolObject_CoolEvent), 
               sender, 
               args);
  • Aussi, vous n'avez pas besoin de créer et de remplir le tableau d'objets parce que le paramètre args est un "params" type de sorte que vous pouvez passer dans la liste.

  • Je serais probablement faveur Invoke sur BeginInvoke du résultat dans le code appelé de manière asynchrone qui peut ou peut ne pas être ce que vous êtes après, mais rendrait la manipulation ultérieure des exceptions difficile à reproduire sans un appel à l' EndInvoke. Qu'arriverait-il, c'est que votre application va bien finir par un TargetInvocationException à la place.

11voto

Konrad Rudolph Points 231505

J’ai shun déclarations délégué redondant.

Pour les non-événements, vous pouvez utiliser le déléguer ou .

EDIT : En outre, chaque événement a un correspondant `` délèguent donc il n’est pas nécessaire du tout pour redéclarer une.

5voto

Dan Herbert Points 38336

De mes recherches, j'ai trouvé que c'est le meilleur moyen de faire des appels inter-threads.

Ce que j'aime à faire est de mettre en place certains génériques événements/gestionnaires afin que je puisse les réutiliser et réduire le code. Par exemple, définir le texte de l'étiquette est quelque chose que je fais beaucoup de choses sur les appels de fil, j'ai donc créer une méthode/de la délégué pour la mise en texte pour les contrôles

delegate void SetTextCallback(Control ctrl, string text);

private void SetText(Control ctrl, string text)
{
    if (ctrl.InvokeRequired)
    {
        ctrl.BeginInvoke(new SetTextCallback(SetText), ctrl, text));
    }
    else
    {
        ctrl.Text = text;
    }
}

Comme pour l'utilisation, je viens de l'appeler SetText() et l'envoyer à mon contrôle et le texte que je veux pour elle. Cela me permet de ré-utiliser mon délégués assez simplement. Je fais la même chose pour d'autres croix fil des actions de réglage de la couleur, visible, permis, etc.

C'est assez spécifique de Windows forms même si elle peut être appliquée à d'autres situations si nécessaire.

3voto

Dmitri Nesteruk Points 7669

Selon moi, que la plus propre consiste certainement à suivre la voie de l’AOP. Faire quelques aspects, ajoutez les attributs nécessaires et vous n’aurez jamais à revérifier l’affinité de thread.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X