2009-02-14 18 views
7

काम पर हम उपयोगकर्ता इंटरफ़ेस के लिए DevExpress का उपयोग करते हैं। पहली बार DevExpress नियंत्रण को नियोजित करने वाला एक फॉर्म खोला जाता है, वहां एक लंबा विराम होता है (कभी-कभी कुछ ग्राहकों पर 15-20 सेकंड)। विजुअल स्टूडियो में मैं देख सकता हूं कि उस चरण के दौरान कई असेंबली लोड की जा रही हैं। क्या लॉगिन स्क्रीन से पहले उदाहरण के लिए उत्पन्न होने वाले धागे पर पृष्ठभूमि में ऐपडोमेन में असेंबली को प्रीलोड करने का कोई तरीका है?प्रीलोडिंग असेंबली

उत्तर

0

असेंबली पर एक नज़र डालें। लोड विधियां।

Gero

2

हालांकि यह अपने उपयोगकर्ताओं को बाध्य हमेशा शुरू अप पर कि हिट लेने के लिए होगा।

आम तौर पर यह एक बुरा विचार है (यदि आपके पास हिट है तो कम से कम इसे तब तक रोक दें जब तक आपको वास्तव में इसकी आवश्यकता न हो)। एक मामला जहां यह मदद कर सकता है, लोड को ट्रिगर करना है यदि पर निकट भविष्य में कार्यक्षमता का उपयोग करने के लिए एक मजबूत मौका है लेकिन सिस्टम अन्यथा निष्क्रिय है। हालांकि यह सही करने के लिए बहुत मुश्किल हो सकता है।

आप देख सकते हैं कि लोड की गई असेंबली में से कोई भी आपके नियंत्रण में है और जीएसी में है। यदि ऐसा है तो आप उन्हें एनजी कर सकते हैं जो आपके यूआई के इस पहलू के स्टार्टअप समय पर महत्वपूर्ण प्रभाव डाल सकता है।

+0

मैं पृष्ठभूमि थ्रेड में असेंबली लोड करने की योजना बना रहा हूं, जबकि उपयोगकर्ता अपना उपयोगकर्ता नाम और पासवर्ड टाइप करता है, इसलिए स्टार्टअप पर कोई उल्लेखनीय हिट नहीं होगी। – Rauhotz

+0

जब तक: 1) डीएलएस * हमेशा * आवश्यक 2) लोडिंग समय लॉग ऑन करने के समय से बहुत करीब या कम होता है। यदि ये दोनों सत्य हैं तो यह उपयोगी हो सकता है ... – ShuggyCoUk

1

मुझे यकीन नहीं है, लेकिन मुझे लगता है कि असेंबली की वास्तविक लोडिंग समय-समय पर हिस्सा नहीं है - लेकिन शायद कोड पथ के जेआईटी संकलन। शायद आप ngen को देखना चाहते हैं। हो सकता है कि यह प्रदर्शन समस्या दूर हो जाए। लेकिन उस उपकरण के प्रभाव को समझना सुनिश्चित करें।

लिंक: - http://msdn.microsoft.com/en-us/library/6t9t5wcf.aspx - http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

+0

रोकथाम के दौरान CPU उपयोग बहुत कम है। – Rauhotz

+0

हम्म, मैं वैसे भी ngen के साथ precompiling करने की कोशिश करेंगे। वे बहुत अनुकूलन छोड़ देते हैं। शायद स्टार्टअप लागत दूर हो जाती है। –

+0

यह सीपीयू उपयोग इतना अतिरिक्त डिस्क के रूप में इतना आवश्यक नहीं है IO की आवश्यकता है। – ShuggyCoUk

4

एक अन्य विकल्प के बजाय हाथ से ऐसा करने का asynchronious विधानसभाओं लोड करने के लिए JIT मजबूर करने के लिए है। यह चाल बस नियंत्रण के निर्माता को कॉल करना है, इसलिए जिट जानता है कि उसे उस विशेष कोड पथ को संकलित करना शुरू करना है। आम तौर पर यह सभी निर्भर असेंबली लोड करने के लिए मजबूर करता है। बस कोशिश करने के द्वारा कन्स्ट्रक्टर के कॉल को घेरना सुनिश्चित करें।

कैसे करना है कि 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) { } 

     }); 
    } 
} 

लेकिन यदि पूर्व लोड हो रहा है करने के लिए एक बेहतर समय है कि आप भी लॉगिन फार्म के निर्माता में इसी तरह कुछ कर सकते हैं,। बस PreJitControls विधि को लॉगिन फॉर्म में ले जाएं और इसे कन्स्ट्रक्टर से कॉल करें।

0

यदि आप अपनी असेंबली तेजी से प्राप्त करने की कोशिश कर रहे हैं, तो अपने कोड के लिए एनजीएनएन पर नज़र डालें। पृष्ठभूमि में पूर्व जेआईटी सब कुछ। यह प्रो और कॉन है हालांकि आपका ऐप क्या कर रहा है इसके आधार पर।

संबंधित मुद्दे