2010-03-27 23 views
5

मेरे पास एक प्रक्रिया है, जो चरण-दर-चरण संदेशों को आउटपुट करती है (यानी, प्रसंस्करण आइटम 1 ... आइटम 2 में त्रुटि आदि)।एएसपी.नेट में डेटा प्रोसेस करते समय मैं प्रगति संदेशों को कैसे अपडेट कर सकता हूं?

मैं चाहता हूं कि यह प्रक्रिया के दौरान उपयोगकर्ता को आउटपुट हो, अंत में नहीं।

मुझे यकीन है कि मुझे इसे थ्रेडिंग के साथ करने की ज़रूरत है, लेकिन एक सभ्य उदाहरण नहीं मिल रहा है।

उत्तर

6

यह कोई थ्रेडिंग समस्या नहीं है, लेकिन एक वेब ब्राउज़र UI समस्या है। आप ब्राउज़र पर स्थिति प्रस्तुत करना चाहते हैं क्योंकि आप सर्वर पर काम कर रहे हैं। सिद्धांत रूप में आप की तरह कुछ कर सकता है:

Response.Write("something"); 
Response.Flush(); 

लेकिन Flush() सुनिश्चित नहीं होंगे ब्राउज़र वास्तव में उस समय आपके कोड बना देता है। हकीकत में आप इस बात को नियंत्रित नहीं कर सकते कि कैसे सर्वर से ब्राउज़र में कैश/चंक/बफर किया जाता है। तो प्रत्येक अद्यतन एक 'पूर्ण' http लेनदेन होना चाहिए।

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

AJAX और .NET के साथ AJAX प्रगति संकेतक करने के लिए Real-Time Progress Bar With ASP.NET AJAX देखें।

इस लेख में एक http हैंडलर के साथ एक प्रगति बार बनाने का एक उत्कृष्ट उदाहरण है: http://www.asp101.com/articles/matt/progressbar/default.asp

आईई या क्रोम में, निम्न कोड फ़ायरफ़ॉक्स में काम करता है, मेरी बात साबित नहीं बल्कि करने के लिए:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Buffer = false; 
    Response.Clear(); 
    Response.Write("<html><body>"); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Thread.Sleep(2000); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Thread.Sleep(2000); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Thread.Sleep(2000); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Response.Write("</body></html>"); 
    Response.End(); 
} 
+0

मैंने वास्तव में साफ-सुथरा तरीका देखा है जो पहले धागे का उपयोग करता था ... बस याद नहीं किया जा सकता है, और यह कैसे करें। यह मूल रूप से एक विधि चल रहा है, और हर बार, अगली प्रगति संदेश प्रदर्शित होता है – Danny

+0

आपका काम उस थ्रेड पर निष्पादित होगा जो इसकी प्रगति स्थिति को अद्यतन करता है। फिर आपका ग्राहक राज्य के लिए मतदान करेगा। लेकिन जैसा कि मैंने उल्लेख किया है, आप सिद्धांत में काम को थ्रेड में बंद कर सकते हैं और Response.Write और Response.Flush के साथ प्रगति लिख सकते हैं, लेकिन आपको गारंटी नहीं है कि यह वास्तव में ब्राउज़र पर फंस गया है और पूरे अनुरोध को पूरा करने से पहले प्रस्तुत किया गया है। –

+0

मुझे नहीं लगता कि Response.Write धागे में काम करता है। हालांकि, मैंने जो आइटम पहले देखा था उस पर कुछ वापस आ रहा है, और मुझे लगता है कि यह स्थिति क्लाइंट पक्ष को पूल करने के लिए AJAX का उपयोग कर सकता है। – Danny

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

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