2009-02-14 7 views
7

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

0

jetez un coup d'œil aux méthodes Assembly.Load.

Gero

2

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.

+0

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

+0

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

1

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

+0

L'utilisation du processeur est assez faible pendant la pause. – Rauhotz

+0

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. –

+0

ce n'est pas tant l'utilisation du processeur que le disque supplémentaire dont il a besoin. – ShuggyCoUk

4

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.

0

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.

Questions connexes