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);