मैं वेबफॉर्म में एसिंक का परीक्षण कर रहा हूं और एक बार, मेरा प्रश्न कुछ नहीं करने के बारे में नहीं है, यह इस बारे में है कि पहले से ही कुछ काम करता है, काम करता है। यह मेरा टेस्ट कोड है:वेबफॉर्म में Async/Await - पृष्ठ जीवन चक्र से पहले निरंतरता कैसे चलती है?
protected override void OnPreRender(EventArgs e)
{
Response.Write("OnPreRender<Br>");
}
protected override void OnPreRenderComplete(EventArgs e)
{
Response.Write("OnPreRenderComplete<Br>");
}
protected async override void OnLoadComplete(EventArgs e)
{
Response.Write("OnLoadComplete<br>");
var t1 = Task.Factory.StartNew(() => {
System.Threading.Thread.Sleep(2000);
return 1;
});
//This actually does run:
Response.Write((await t1).ToString());
}
तो मेरा कार्य थोड़ी देर के लिए रुकता है और फिर परिणाम लिखता है। मेरा सवाल है - मैं यह काम करने की उम्मीद नहीं करता क्योंकि ऑनलोड लोड विधि से नियंत्रण प्राप्त किया गया है - मैं उम्मीद करता हूं कि पृष्ठ वास्तव में प्रतिपादन समाप्त कर देगा और मेरे कार्य को वापस लौटने से पहले ग्राहक को वापस कर दिया जाएगा।
वास्तविक उत्पादन होता है:
OnLoadComplete
OnPreRender
1OnPreRenderComplete
तो यह स्पष्ट है कि OnLoadComplete विधि नियंत्रण झुकेंगे ताकि OnPreRender चला सकते हैं और उसके बाद OnLoadComplete को लौट नियंत्रित करते हैं। मेरा अनुमानित परिणाम यह था कि "1" कभी प्रिंट नहीं करेगा क्योंकि बाद की घटनाएं आग लग जाएंगी और पृष्ठ का धागा या तो मारा जाएगा या प्रतिक्रिया के बाद पोस्ट-टास्क लेखन होगा। मुझे लगता है, उपर्युक्त दिया गया है, यह आश्चर्य की बात नहीं है कि अगर मैं 10 सेकंड के लिए देरी करता हूं, तो परिणाम बिल्कुल वही है।
मुझे लगता है कि वेबफॉर्म इंजन में कुछ वायरिंग है जो सुनिश्चित करता है कि पेज के जीवन चक्र के अगले चरण से पहले कोई भी प्रतीक्षा पूरी हो जाती है। क्या कोई यह सुनिश्चित करने के लिए जानता है कि यह कैसे होता है? मुझे उन तरीकों में एसिंक/प्रतीक्षा करने का डर है जो डर के लिए अन्य घटनाओं से पहले पूरा करने की आवश्यकता है कि निरंतरता बहुत देर हो जाएगी, लेकिन अगर इसे आंतरिक रूप से संभाला जाता है, तो मैं चिंता नहीं करूंगा।