2010-06-10 37 views
5

मेरे पास एक पृष्ठ है जो पृष्ठ_लोड विधि में एक लंबे समय तक चलने वाला कार्य (10 से 15 सेकंड) करता है।एएसपी.नेट - पृष्ठ लोड हो रहा है जबकि संदेश प्रदर्शित हो रहा है

मेरे पास क्लाइंट-साइड जावास्क्रिप्ट कोड है जो उपयोगकर्ता को एक सभ्य "पृष्ठ लोडिंग" एनिमेटेड gif प्रदर्शित करेगा।

मैं "पेज लोडिंग" एनिमेटेड gif को प्रदर्शित करने के लिए कोड-बैक से जावास्क्रिप्ट विधि का आह्वान करने में सक्षम हूं, हालांकि, लंबे समय तक चलने वाला कार्य यूआई को लटक रहा है जैसे कि एनिमेटेड gif वास्तव में प्रदर्शित नहीं होता है लंबे समय तक चलने वाला कार्य पूरा होने तक, जो मैं चाहता हूं उसके विपरीत है।

इसका परीक्षण करने के लिए, मेरी पेज_लोड विधि में मैं एनिमेटेड gif को प्रदर्शित करने के लिए जावास्क्रिप्ट विधि पर कॉल करता हूं। फिर, मैं थ्रेड स्लीप (10000) का उपयोग करता हूं। क्या होता है कि एनिमेटेड gif थ्रेड के बाद तक प्रदर्शित नहीं होता है। नींद पूरी हो गई है।

स्पष्ट रूप से मैं कुछ गलत कर रहा हूं।

किसी भी सलाह की सराहना की जाएगी।

धन्यवाद।

protected void Page_Load(object sender, EventArgs e) 
    { 
     ClientScript.RegisterStartupScript 
       (GetType(), "Javascript", "javascript: ShowWaitIndicator(); ", true); 

     Response.Flush(); 

     Thread.Sleep(10000); 
    } 
+0

आप जावास्क्रिप्ट को कोड-पीछे से नहीं बुला सकते हैं। आप जो भी कर सकते हैं उसे प्रतिक्रिया स्ट्रीम में जोड़ना है, जो क्लाइंटस्क्रिप्ट है। रजिस्ट्रार स्टार्टअपस्क्रिप्ट कर रहा है। अंत में यह ब्राउज़र पर वापस भेजा जाएगा। यह दो पूरी तरह से अलग संदर्भ है। कोडबेहिंड सर्वर पर चलता है, जावास्क्रिप्ट ब्राउज़र पर निष्पादित करता है। – womp

उत्तर

0

यह जावास्क्रिप्ट ऑनलोड एएसपी ऑनलोड प्रक्रियाओं के बाद प्रदर्शित किया जा रहा है की तरह लगता है:

क्रिस

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

फिर, आप फ़ंक्शन पूर्ण होने के बाद आवश्यक पृष्ठ सामग्री अपडेट करेंगे।

क्या आप कोड का उदाहरण प्रदान कर सकते हैं?

+0

मैंने मूल पोस्ट को कोड-पीछे का उदाहरण शामिल करने के लिए संशोधित किया। – Chris

3

मैंने पृष्ठ पर एक टाइमर लगाकर इसे पूरा किया। इसके पहले टिक के बाद इसे अक्षम करें और अपना कार्य चलाएं।

<asp:Timer runat="server" id="UpdateTimer" interval="500" ontick="UpdateTimer_Tick" /> 

मैंने इसे अपनी आवश्यकताओं के लिए अपडेटपेनल में रखा है। मुझे यकीन नहीं है कि आपके लिए सबसे अच्छा क्या काम करेगा। फिर अपने कोड के पीछे ... में

Protected Sub UpdateTimer_Tick(ByVal sender As Object, ByVal e As EventArgs) 
     UpdateTimer.Enabled = False 

     ' run method here 

    End Sub 
4

कारण है कि Page.Load घटना आग से पहले किसी भी प्रतिक्रिया ग्राहक के लिए भेज दिया गया है; इसलिए ग्राहक के लिए कोई भी निर्देश (जैसे कि आपके जावास्क्रिप्ट को निष्पादित करना) तब तक नहीं होता जब तक क्लाइंट प्रतिक्रिया प्राप्त न करे।

तो ... पेज.लोड में लंबे समय तक चलने वाले कार्य को रखने का प्रभाव आपके पास नहीं होगा। यह AJAX या एसिंक्रोनस डेटा-पुनर्प्राप्ति के किसी अन्य रूप का उपयोग करने के मामले की तरह लगता है। इस परिदृश्य में जिस पृष्ठ पर आप क्लाइंट लौटते हैं, वह आपके लंबे समय तक चलने वाले कार्य का परिणाम नहीं है - इसलिए पृष्ठ स्वयं (इसके स्पिनर के साथ) तेज़ी से लोड होता है, तो क्लाइंट डेटा का अनुरोध करता है; जब डेटा तैयार होता है (10-15 सेकंड बाद में) आप परिणामों में क्लाइंट में डीओएम अपडेट कर सकते हैं।

1

मैं कोड-पीछे से आपकी जावास्क्रिप्ट को आमंत्रित करने से बचूंगा।

इसके बजाय, jQuery लाइब्रेरी का उपयोग करें।आप ट्रिगर कर सकते हैं अपने कोड के तुरंत बाद डोम निम्नलिखित कोड का उपयोग करके लोड किया जाता है के नाम से जाना:

$(document).ready(function() { 
    //Call your JavaScript method here. 
}); 

आपको अपने पेज है, जो एकल स्क्रिप्ट माइक्रोसॉफ्ट CDN से शामिल करने के लिए jQuery जोड़ने की आवश्यकता होगी। अपने मार्कअप को यह जोड़े ऐसा करने के लिए:

<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.min.js"></script> 

यह आपके GIF JavaScript विधि तुरंत जब पेज लोड फोन होगा और आप अपने Thread.Sleep समाप्त कर सकते हैं। मुझे लगता है कि आपकी एनिमेटेड जीआईएफ विधि 10-15 सेकंड के बाद छवि को स्वचालित रूप से छुपाती है।

+0

मैं केवल थ्रेड का उपयोग कर रहा हूं। लंबे समय तक चलने वाले कार्य को अनुकरण करने के लिए सो जाओ। मैंने आपके दृष्टिकोण की कोशिश की, और पेज_लोड विधि में थ्रेड। सो (10000) डाला और यह अभी भी 10 सेकंड के बाद तक gif लोड नहीं करता है। – Chris

+1

गोचा, मैंने सोचा था कि आप थ्रेड का उपयोग कर रहे थे। जीआईएफ के गायब होने में देरी करने के लिए सो जाओ। उस स्थिति में, Yoooder की प्रतिक्रिया नीचे जाने का सबसे अच्छा मार्ग है। आप अभी भी jQuery का उपयोग कर सकते हैं और "WebMethod" विशेषता से सजाए गए पृष्ठ विधि को कॉल करने के लिए ".ajax" विधि का उपयोग कर सकते हैं। इसके बारे में यहां एक लेख है: http://encosia.com/2008/05/29/using-jquery-to- प्रत्यक्ष रूप से-call-aspnet-ajax-page-methods/ आपके वेबमाइड में आपका थ्रेड होगा। सो जाओ लंबे समय तक चलने वाले काम का अनुकरण करें। –

4

निम्नलिखित उदाहरण आपके लिए काम करेगा। पेज लोड इवेंट में बस रखें।

Response.Write("<div id=\"loading\" style=\"position:absolute; width:100%; text-align:center; top:300px;\"><img src=\"http://www.cse.iitk.ac.in/users/singhroh/images/loading.gif\" border=0></div>"); 
    Response.Flush(); 
    System.Threading.Thread.Sleep(5000);   
    Response.Write("script>document.getElementById('loading').style.display='none';</script>"); 
+0

क्या वही विचार प्रतीत होता है कि आपको पृष्ठ के शीर्ष निर्देश में बफर = "झूठी" जोड़ने की आवश्यकता है, अन्यथा यह केवल एक ही समय में प्रदर्शित होता है। बफर = "झूठी" करने के बाद भी – John

+0

यह काम नहीं कर रहा है – Kapil

1

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

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