2017-04-26 6 views
9

पर विचार इन दोनों नियंत्रक तरीके:यदि हम ASP.NET कोर में लंबे एसिंक ऑपरेशन का इंतजार करते हैं तो संभावित समस्याएं क्या हैं?

public async Task DoAsync() { 
    await TaskThatRunsFor10MinutesAsync().ConfigureAwait(false); 
} 

public void DoWithTaskRunAndReturnEarly() { 
    Task.Run(() => TaskThatRunsFor10MinutesAsync()); 
} 

के ग्राहक के पक्ष हम प्रतिक्रिया के बारे में परवाह नहीं है पर करते हैं। हम इसे पूरा करने के लिए इंतजार कर सकते हैं, हम इसे आधे रास्ते से छोड़ सकते हैं क्योंकि उपयोगकर्ता पृष्ठ को रीफ्रेश कर रहा है - लेकिन इससे कोई फर्क नहीं पड़ता कि DoWithTaskRunAndReturnEarly पहले रिटर्न करता है।

क्या उन दो दृष्टिकोणों के बीच एक महत्वपूर्ण सर्वर-साइड अंतर है, उदाहरण के लिए विश्वसनीयता, टाइमआउट, आदि में? क्या ASP.NET कोर कभी भी टाइमआउट पर धागे को रोकता है?

उत्तर

5

एएसपी.नेट कोर 1.1 में सॉकेट CLOSE_WAIT स्थिति में तब तक रहेगा जब तक कि एप्लिकेशन Task पूर्ण नहीं हो जाता। इससे सर्वर के पक्ष में संसाधन थकावट हो सकती है यदि आपके पास सर्वर पर बहुत लंबे समय तक चलने वाले कार्य हैं जहां क्लाइंट पहले ही डिस्कनेक्ट हो चुका है (आपके मामले में पृष्ठ को रीफ्रेश किया गया है)।

क्या उन दो दृष्टिकोणों के बीच एक महत्वपूर्ण सर्वर-साइड अंतर है, उदाहरण के लिए विश्वसनीयता, टाइमआउट, आदि में? क्या ASP.NET कोर कभी भी टाइमआउट पर धागे को रोकता है?

थ्रेड रोकता एक अब और नेट कोर में "बात" नहीं हैं और वैसे भी async कोड के लिए काम नहीं होता है (वहाँ कोई सक्रिय धागा जब आप का इंतजार कर रहे हैं)।

एएसपी.NET कोर (2.x लिखने के समय) के अगले संस्करण में अनुरोध सॉबर्टेड रद्दीकरण टोकन ट्रिगर जब क्लाइंट सॉकेट एक एफआईएन भेजता है तो आप लंबे समय तक चलने वाले काम को रद्द करने के लिए डिस्कनेक्ट करने वाले ग्राहकों पर प्रतिक्रिया करने में सक्षम होंगे । उस पर, एप्लिकेशन पूर्ण होने से पहले भी सॉकेट बंद कर देगा।

+0

यदि अनुरोध-निरस्त सीटी v2 में आ रहा है, तो सीटी (नियंत्रक विधियों को पारित करने वाला) आज क्या करता है? –

+1

यदि ग्राहक केस्ट्रेल में आरएसटी भेजता है या यदि आप सीधे HttpContext.Abort को कॉल करते हैं तो यह ट्रिगर हो जाता है – davidfowl

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