Au travail, nous utilisons DevExpress pour l'interface utilisateur. La première fois qu'un formulaire utilisant un contrôle DevExpress est ouvert, il y a une longue pause (parfois 15-20 secondes sur certains clients). Dans Visual Studio, je peux voir que des tonnes d'assemblys sont en cours de chargement pendant cette phase. Est-il possible de précharger ces assemblys dans l'AppDomain en arrière-plan sur un thread généré par exemple avant l'ouverture de l'écran de connexion?Préchargement des assemblages
Répondre
jetez un coup d'œil aux méthodes Assembly.Load.
Gero
Cela forcera cependant vos utilisateurs de toujours prendre ce coup au démarrage.
En général, c'est une mauvaise idée (si vous avez le hit au moins différer jusqu'à ce que vous en ayez vraiment besoin). Un cas où il pourrait être utile de déclencher la charge s'il y a une forte chance qu'ils soient va utiliser pour utiliser la fonctionnalité dans un proche avenir, mais le système est autrement inactif. Cela peut être très difficile à faire avec précision cependant.
Vous pouvez voir si l'un des assemblys chargés est sous votre contrôle et dans le GAC. Si oui, vous pouvez les modifier ce qui peut avoir un effet significatif sur le temps de démarrage de cet aspect de votre interface utilisateur.
Je ne suis pas sûr, mais je devine que pas le chargement réel des assemblées est la partie de timeconsuming - mais probablement la compilation JIT du chemin de code. Peut-être que vous voulez regarder ngen. pourrait être que cela rend le problème de performance disparaître. mais assurez-vous de comprendre les implications de cet outil.
Liens: - http://msdn.microsoft.com/en-us/library/6t9t5wcf.aspx - http://msdn.microsoft.com/en-us/magazine/cc163610.aspx
L'utilisation du processeur est assez faible pendant la pause. – Rauhotz
Hmm, j'essayerais quand même de précompiler avec ngen. Ils abandonnent beaucoup d'optimisation. Peut-être que le coût de démarrage disparaît. –
ce n'est pas tant l'utilisation du processeur que le disque supplémentaire dont il a besoin. – ShuggyCoUk
Un autre choix est de forcer le JIT à charger les assemblées asynchronious au lieu de le faire à la main. L'astuce consiste simplement à appeler le constructeur du contrôle, de sorte que le Jit sait qu'il doit commencer à compiler ce chemin de code particulier. Habituellement cela le force à charger tous les assemblages dépendants. Assurez-vous juste d'entourer l'appel du constructeur par une prise d'essai.
Un exemple de la façon de le faire à loadtime:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
PreJitControls();
Application.Run(new Form1());
}
private static void PreJitControls()
{
ThreadPool.QueueUserWorkItem((t) =>
{
Thread.Sleep(1000); // Or whatever reasonable amount of time
try
{
AssemblyPullingControl1 c = new AssemblyPullingControl1();
}
catch (Exception) { }
try
{
AssemblyPullingControl2 c = new AssemblyPullingControl2();
}
catch (Exception) { }
});
}
}
Mais vous pouvez aussi faire quelque chose de similaire dans le constructeur du formulaire de connexion, si c'est un meilleur moment pour faire le pré-chargement. Il suffit de déplacer la méthode PreJitControls vers le formulaire de connexion et de l'appeler depuis le constructeur.
Si vous essayez d'obtenir vos assemblys plus rapidement, pourquoi ne pas jeter un oeil à NGEN pour votre code. Pré JIT tout en arrière-plan. Cela a des avantages et des inconvénients, mais en fonction de ce que votre application est en train de faire.
- 1. html préchargement
- 2. Chargement des assemblages
- 3. Liaison des assemblages .Net
- 4. Sécurisation des assemblages .net
- 5. ennuis Avoir préchargement des images avec javascript
- 6. préchargement éléments img
- 7. jQuery Rollovers Non préchargement
- 8. énumération des assemblages dans GAC
- 9. Dynamiquement chargement des assemblages .NET
- 10. images jquery avec préchargement image
- 11. Suppression (ou préchargement) des détails d'adresse pour PayPal Express Checkout
- 12. Visual Studio: détection des assemblages inutiles
- 13. Séparation des responsabilités dans les assemblages
- 14. Chargement des assemblages et de leurs dépendances
- 15. Chargement des assemblages à partir du réseau
- 16. Utilisation des paramètres d'application dans les assemblages
- 17. Cartes d'image HTML et préchargement d'images
- 18. ASP.NET MVC Compiler des vues dans des assemblages distincts
- 19. Versionnement des assemblages d'application distribuée avec des correctifs à chaud
- 20. Bibliothèque d'entreprise 4.1 Assemblages
- 21. as3 - Préchargement de la galerie d'images XML
- 22. Question de préchargement d'image en général
- 23. Récupère les chemins des assemblages utilisés dans Type
- 24. maven-assembly plugin - comment créer des assemblages imbriqués
- 25. Est-il possible de générer des assemblages de manière sélective?
- 26. LINQPad: "BadImageFormatException" lors de l'utilisation des assemblages (.NET4) VS2010?
- 27. Dire à IKImageBrowserView de ne pas planifier le préchargement
- 28. C#: Préchargement de formulaires sur un thread séparé
- 29. préchargement flex ne fonctionne pas aveC# dans l'url (lien profond)
- 30. Préchargement de classes/bibliothèques java au démarrage de jar?
Je prévois de charger les assemblages dans un thread d'arrière-plan pendant que l'utilisateur tape son nom d'utilisateur et son mot de passe, donc il n'y aura pas de hit notable au démarrage. – Rauhotz
Il y aura à moins que: 1) Les dll sont * toujours * requis 2) Le temps de chargement est très proche ou inférieur au temps nécessaire pour se connecter. Si ces deux valeurs sont vraies, cela peut être utile ... – ShuggyCoUk