Temps d’installation lent de liaison de données dans C # .NET 4.0

J’ai un problème. J’ai une application Windows Forms avec une mise en page générée dynamic, mais j’ai un problème de performances. Sous cette forme, j’utilise DataBinding partir de .NET 4.0 et la liaison de données après l’installation fonctionne bien, mais le temps d’installation obligatoire pour ONE control bloquant l’application sur environ 0,7 seconde. J’ai quelques contrôles et le temps d’installation de binging est environ 2 minutes .

J’essaie toutes les solutions possibles, je n’ai aucune idée sans écrire une classe auto-contraignante. Pourquoi est-ce que je me trompe avec mon code?

 case "Boolean": { Binding b = new Binding("Checked", __bindingsource, __ep.Name); CheckBox cb = new CheckBox(); /* * HERE is the start of problem */ cb.DataBindings.Add(b); /* * HERE is the end of problem */ __flp.Controls.Add(cb); __bindingcontrol.AddBinding(b); break; } 

Sans problème, toutes les lignes de code fonctionnent rapidement et sans liaison ;-( mais je veux que la liaison soit activée à une vitesse normale.

PS1. J’ai suspendu la mise en page en temps de génération.

PS2. J’ai le même problème avec la liaison TextBox’es, PictureBoxe, CheckBox n’est qu’un exemple.

Comment faire cela ou un peu plus comment déboguer le problème, le profileur vs2010 dit que seul le problème est la liaison et je le sais.

  1. System.Windows.Forms.Control.ControlCollection.Add (classe System.Windows.Forms.Control)
  2. System.Windows.Forms.ControlBindingsCollection.Add (classe System.Windows.Forms.Binding)

EDIT: DataContext est de la firebase database. (Cadre d’entité)

Vous n’êtes pas sûr que ce soit le problème dans votre cas, mais la liaison peut sembler prendre beaucoup de temps si elle déclenche une “tempête d’événements”. C’est-à-dire que vous vous liez au contrôle A, ce qui déclenche un changement de contrôle B, ce qui déclenche un changement de contrôle A …

Une chose à vérifier est alors les événements sur les contrôles que vous mettez à jour.

L’autre chose est que, d’après vos commentaires, il semble que vous partagiez la __bindingsource entre les formulaires. Cela pourrait être la racine du problème. Pourquoi fais-tu ça? L’utilisation d’une source de liaison par formulaire rendrait votre programme plus facile à gérer.

Cela ne fonctionne pas rapidement car __bindingsource comporte de nombreux éléments. Binding ne fonctionne pas bien avec les grandes collections et c’est un problème.

__bindingsource est une classe BindingSource . Et doit avoir beaucoup moins d’éléments pour travailler rapidement. J’ai résolu ce problème en créant une nouvelle instance BindingSource pour chaque BindingSet (je veux dire Binding onetime avec beaucoup d’éléments aux propriétés d’un object) avec un seul élément, uniquement ce que je veux utiliser.

J’ai eu ce problème également. J’ai défini DataSourceUpdateMode sur Never (dans le constructeur Binding -class): Les performances étaient alors bien meilleures. Si vous n’avez pas besoin de mettre à jour votre source de données, c’est la bonne façon de procéder.

Ce problème de performances est dû à l’événement de validation déclenché. Même si un contrôle perd le focus ou est cliqué, cela déclenche un événement de validation, ce qui peut réduire considérablement les performances de votre application.

EDIT: Bien que je ne me suis pas lié à EntityFramework, la performance était très mauvaise. La définition de DataSourceUpdateMode sur Never réduit le nombre d’événements déclenchés. Une fois que vous avez défini le paramètre DataSourceUpdatedMode sur Never , les mises à jour seront unidirectionnelles: De DataSource à Control.