Precaricamento di assiemi

Al lavoro usiamo DevExpress per l’interfaccia utente. La prima volta che viene aperto un modulo che utilizza un controllo DevExpress c’è una lunga pausa (a volte 15-20 secondi su alcuni client). In Visual Studio posso vedere che tonnellate di assiemi vengono caricati durante questa fase. C’è un modo per precaricare gli assembly in AppDomain in background su un thread che viene generato ad esempio prima che venga visualizzata la schermata di login?

Un’altra scelta è quella di forzare il JIT a caricare gli assembly in modo asincrono invece di farlo manualmente. Il trucco è chiamare semplicemente il costruttore del controllo, quindi il Jit sa che deve iniziare a compilare quel particolare percorso di codice. Di solito questo lo costringe a caricare tutti gli assembly dipendenti. Assicurati di racchiudere la chiamata del costruttore da un tentativo di cattura.

Un esempio di come farlo al momento del caricamento:

static class Program { ///  /// The main entry point for the application. ///  [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) { } }); } } 

Ma potresti anche fare qualcosa di simile nel costruttore del modulo di login, se è il momento migliore per effettuare il pre-caricamento. Basta spostare il metodo PreJitControls al modulo di accesso e chiamarlo dal costruttore.

Ciò costringerà comunque i tuoi utenti a prendere sempre il colpo all’avvio.

In generale questa è una ctriggers idea (se hai almeno il successo, differiscila fino a quando ne hai davvero bisogno). Un caso in cui potrebbe essere d’aiuto è di innescare il carico se c’è una forte possibilità che utilizzeranno la funzionalità nel prossimo futuro, ma il sistema è altrimenti inattivo. Questo può essere molto difficile da fare con precisione.

Potresti vedere se qualcuno degli assembly caricati è sotto il tuo controllo e nel GAC. In tal caso, potresti annullarli, il che potrebbe avere un effetto significativo sull’orario di avvio di questo aspetto dell’interfaccia utente.

Non ne sono sicuro, ma suppongo che il caricamento effettivo degli assembly non sia la parte relativa al tempo, ma probabilmente la compilazione JIT del percorso del codice. Forse vuoi guardare ngen. potrebbe essere che fa andare via il problema delle prestazioni. ma sii sicuro di capire le implicazioni di quello strumento.

Collegamenti: http://msdn.microsoft.com/en-us/library/6t9t5wcf.aspxhttp://msdn.microsoft.com/en-us/magazine/cc163610.aspx

dare un’occhiata ai metodi Assembly.oad.

Gero

Se stai cercando di ottenere gli assembly più velocemente, perché non dare un’occhiata a NGEN per il tuo codice. Pre JIT tutto sullo sfondo. Questo ha pro e contro a seconda di cosa sta facendo la tua app.