3 votes

Simplifier les appels inter-filières du code winforms

Je suis en train de développer une application multithread qui a quelques méthodes dans Invoke :

if (this.InvokeRequired)
{
    this.Invoke((Action)(() =>
    {
        pbTotalProgress.Value = progress;
        labe1.Text="SomeText";
    }));
}
else
{
    pbTotalProgress.Value = progress;
    labe1.Text="SomeText";
}

Comment puis-je raccourcir le code ci-dessous ?

3voto

Hamish Smith Points 5961

Vous devriez, au moins, ne définir l'action qu'une seule fois (ne pas avoir le code à nouveau dans la branche else, juste exécuter l'action là sans l'invoke.
Vous pouvez également écrire une méthode d'extension pour le contrôle qui exécute une action en tant qu'invocation si nécessaire ou qui l'exécute simplement. Vous vous débarrasserez ainsi de la complexité de votre gestionnaire d'événements et vous finirez par utiliser le même modèle pour de nombreux événements dans votre application.

static class ControlExtensions
{
  public static void InvokeOrExecute(this Control control, Action action)
  {
     if (control.InvokeRequired)
     {
        control.Invoke(action);
     }
     else
     {
        action();
     }
  }
}

Dans chaque cas, il pourrait s'agir d'un fil conducteur :

Action setProgress = delegate()
     {
        pbTotalProgress.Value = progress;
        labe1.Text = "SomeText";
     };
this.InvokeOrExecute(setProgress);

1voto

newfurniturey Points 16866

Puisqu'il s'agit du même bloc de code, vous pourriez l'insérer dans un fichier Action et Invoke /L'exécuter. Essayez quelque chose comme :

Action setProgress = delegate() {
    pbTotalProgress.Value = progress;
    labe1.Text = "SomeText";
};
if (this.InvokeRequired) {
    this.Invoke(setProgress);
} else {
    setProgress();
}

Votre code exact n'a pas vraiment besoin d'être optimisé. La seule chose qui se passe est que vous effectuez un contrôle conditionnel sur un drapeau booléen this.InvokeRequired . En fait, ma réponse ne fait qu'offrir la possibilité d'écrire le code d'action une seule fois au lieu de le dupliquer.

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