9
votes

Comment améliorer le temps de chargement de Winform?

J'ai une application WinForms. La forme principale est de beaucoup de contrôles et c'est l'une des raisons qui le rend très lent. Ce que je voudrais faire, c'est de rendre la forme de la forme plus rapidement.

J'ai défini le beginUpdate et endupdate. Le formulaire n'est pas rendu dans le fil de travail d'arrière-plan, car c'est la forme principale. Il n'y a pas de formulaires initiaux. Lorsque l'utilisateur clique sur l'icône de l'application, il s'agit du premier formulaire qui se charge. L'ajout d'une barre de progression ou d'une forme de splash n'est pas une bonne idée pour moi.

J'ai vérifié d'autres questions ici sur le débordement de la pile, mais ils ne semblent pas faire face au même problème que moi.

S'il y a quelques exemples / idées que vous avez à l'esprit, ce serait gentil de votre part si vous pouvez le partager avec moi.


2 commentaires

J'ai du mal à croire que le chargement des contrôles réguliers est pris beaucoup de temps. Ce n'est pas d'autres choses qui se chargent lentement? Montrer du code


Ce n'est pas le chargement qui est lent, la peinture prend pour toujours avec beaucoup de contrôles. Utilisez moins de contrôles.


4 Réponses :


3
votes

Essayez de minimiser le code qui exécute pendant sur charge de la forme principale ou de l'un quelconque de la commande placée sur la forme principale.

Vous pouvez également explorer Ngen qui est l'outil de Microsoft qui aide à améliorer les performances de l'application gérée


2 commentaires

J'ai utilisé Ngen. Bien que la période de chargement de l'interface utilisateur a diminué encore, j'aimerais que l'interface utilisateur soit affichée dès que l'utilisateur lance l'application.


J'ai vérifié avec et sans ngen .. Le démarrage sans Ngen était 7225 millisecondes .. Après avoir exécuté cette commande Ngén Commande Ngén Installation La durée de démarrage a diminué de plus de la moitié. maintenant ses 3015 .. millisecondes



0
votes

Lorsqu'un formulaire charge, il initialise toutes ses commandes.
La forme elle-même ne vous prend pas longtemps. Ce sont vos contrôles.

Passez sur vos commandes et vérifiez ce qui peut être amélioré dans leurs constructeurs et initialisants.


1 commentaires

Vrai, ses contrôles .. J'utilise une bibliothèque d'accueil, des contrôles de Krypton. Ils sont riches, mais ils viennent également avec une étiquette de mémoire. ont vu d'autres applications utilisant le même ensemble de contrôles, mais ils se chargent assez rapidement. Je me demandais si je pouvais faire la même chose ...



0
votes

Avez-vous besoin de toutes les commandes immédiatement? Si vous ne pouviez peut-être pas les charger de manière programmatique après quelques incendies d'événements qui vous permettent de savoir que vous avez besoin de ce contrôle.


0 commentaires

11
votes

Quelques suggestions:

  • Essayez de minimiser la complexité de l'interface utilisateur. Vos utilisateurs vous en seront reconnaissants et vous aurez moins de contrôles à charger. Par exemple, si vous avez 3 ou 4 contrôles qui ne sont pas utilisés souvent, vous pouvez les déplacer dans une boîte de dialogue ou dépliable section « avancée » de votre formulaire, vous pouvez reporter la création / les montrer? Sont tous les contrôles nécessaires? Vraiment? Pensez à le flux de travail que vous essayez d'atteindre - est l'ensemble actuel de contrôle la façon la plus simple pour atteindre le flux de travail? DO toutes les commandes doivent être montré à la fois? Peut-être que vous pouvez les placer sur des onglets séparés dans un contrôle onglet (et donc seulement créer actuallyl les contrôles que l'onglet est affiché)?

  • Pouvez-vous réduire la gamme de types de contrôle utilisés? Chaque nouveau type de contrôle peut entraîner votre programme pour charger une nouvelle dll pour le soutenir. Chaque dll qui doit être les causes initialisés temps de démarrage supplémentaire.

  • Utilisez-vous des contrôles qui sont lents à démarrer? Un champ de texte simple sera rapide, mais un contrôle peut être complexe graphique lent.

  • Combien assemblées (de votre propre) sont chargés? Combiner tout le code dans un seul ensemble (par exemple avec ILMerge) et les temps de chargement amélioreront probablement un peu.

  • Supprimer tout code d'initialisation qui est pas nécessaire. Pouvez-vous simplifier l'initialisation? Quelqu'un peut-initialisation être différée (par exemple seulement créer des variables membres lorsque l'utilisateur clique sur le premier bouton qui a réellement besoin que les données à présent, ne pas essayer de créer une connexion à une base de données si elle est pas vraiment encore besoin, etc.) < / p>

  • Pouvez-vous différer la création de (certaines) de l'interface utilisateur? Par exemple, vous pourriez être en mesure de placer un groupe de contrôle en une forme UserControl séparée, puis ajoutez ce formulaire à votre programme MainForm peu de temps après le démarrage (par exemple sur une minuterie). Cela permettra à votre MainForm apparaisse très rapidement, et ensuite peu « peuplée » après des contrôles supplémentaires, qui peuvent ne pas améliorer le temps de démarrage réel, mais il « se sentir » beaucoup plus rapide et plus réactif au démarrage. (Cette approche peut également être extrêmement efficace si vos rouleaux de Mainform et ces contrôles supplémentaires sont d'abord pas à l'écran, car ils ne doivent être créés si l'utilisateur fait défiler vers le bas assez pour les voir)

  • Êtes-vous affichiez toute information qui pourrait être lent à la charge (par exemple de grandes images bitmap ou données extraites à partir d'un serveur SQL)? Pouvez-vous reporter le chargement d'entre eux ou l'exécuter comme un fil d'arrière-plan? Utiliser la compression pour accélérer le chargement? Réduire leur résolution afin de minimiser la quantité de données qui doit être chargé? Les données pré-traitement et le stocker dans un cache de démarrage rapide pour la prochaine fois que le programme est exécuté?

  • Peut-être certains contrôles remplacés par une approche optimisée? par exemple. Vous pouvez créer un bouton « bar » comme un ensemble de 10 commandes séparées, ou comme un contrôle unique qui tire iself avec l'apparition de 10 boutons. Il est beaucoup plus facile de faire la Initialiser de contrôle unique et redessiner plus vite que 10 commandes séparées.

    Et bien sûr, une fois que la plupart des fruits de faible pendaison évidente a été recueillie (ou même avant):

    • Lancez le programme sous un profileur et de voir où il est passé son temps.

2 commentaires

J'ai couru le profileur et près de 52% du délai était dû à l'initialisation de la forme. J'ai un environnement comme un environnement où il y a des tonnes d'autres contrôles que l'utilisateur aurait besoin à un moment donné. C'est le problème ..


Cependant, je ressemble à vos idées .. Je vais essayer de mettre en œuvre la plupart d'entre eux .. Cependant ..J'ai décidé d'utiliser un fil de travail d'arrière-plan pour aider à charger certaines des commandes.