2015-09-25 6 views
6

आइए कहें कि आपके पास एक सेवा API कॉल है। कैली कुछ हद तक महत्वपूर्ण प्रदर्शन करता है, इसलिए एपीआई कॉल को जरूरी से अधिक समय तक नहीं पकड़ने के लिए, SaveAsync() विधि का उपयोग किया जाता है। मैं await नहीं कर सकता, हालांकि, क्योंकि यह गैर-एसिंक संस्करण की तुलना में एपीआई कॉल को लंबे समय तक (या शायद लंबा भी) रखेगा।क्या आपको एसिंक तरीकों का इंतजार करना है?

कारण मैं पूछ रहा हूँ यह है: आप नहींawait कॉल कर हैं, तो इस बात की संभावना Task वस्तु लौटे कचरा एकत्र हो जाता है? और यदि हां, तो क्या यह चल रहे कार्य को बाधित करेगा?

+0

आप कोड जहां का एक सा दिखा सकते हैं उन्हें ASP.NET क्रम के साथ रजिस्टर करने के लिए सुनिश्चित करना चाहिए आप इस विधि का इंतजार करेंगे? –

+1

क्या आप वाकई एपीआई धारण करेंगे? जैसा कि मुझे पता है, प्रतीक्षा बिंदु स्पेसियल ब्लॉक पर संग्रहीत किया जाएगा और जब परिणाम आएगा तो सीएलआर आपके लिए सौभाग्य से कोड –

उत्तर

6

कारण मैं पूछ रहा हूँ यह है: आप कॉल का इंतजार नहीं है, तो इस बात की संभावना टास्क वस्तु लौटे कचरा एकत्र हो जाता है?

आम तौर पर, नहीं, ऐसा नहीं होना चाहिए। अंतर्निहित TaskScheduler जो कार्य को कतार देता है, आमतौर पर वांछित जीवन-काल के लिए इसका संदर्भ तब तक पूरा करता है जब तक यह पूरा नहीं हो जाता है। आप देख सकते हैं कि TaskScheduler.QueueTask के दस्तावेज में:

एक ठेठ कार्यान्वयन एक आंतरिक डेटा संरचना है, जो धागे है कि भविष्य में कुछ समय में उन कार्यों को अंजाम होगा द्वारा सेवित किया जाएगा में कार्य संग्रहीत करेंगे।

आपकी वास्तविक समस्या एएसपी.NET सिंक्रनाइज़ेशन कॉन्टेक्स्ट के साथ होने वाली है, जो रनटाइम पर किसी भी चल रहे असीमित ऑपरेशन का ट्रैक रखती है। यदि आपका नियंत्रक एक्शन एसिंक ऑपरेशन से पहले समाप्त होता है, तो आपको अपवाद प्राप्त होगा।

आप "आग और भूल जाओ" है ASP.NET में संचालन करना चाहते हैं, तो आप या तो HostingEnvironment.QueueBackgroundWorkItem के माध्यम से या BackgroundTaskManager

+0

कोड का इंतजार करेगा, यह विंडोज़ सेवा में होस्ट किया गया है और एएसपीनेट में नहीं है। लेकिन यह एएसपीनेट में ऐसा करने के बारे में सोचने वाले किसी भी व्यक्ति के लिए अच्छी जानकारी है। – Alex

2

नहीं, यह चल रहे कार्य को बाधित नहीं करेगा, लेकिन आप कार्य से अपवादों का पालन नहीं करेंगे, जो कि बिल्कुल सही नहीं है। आप try ... catch में सभी चल रहे कोड को लपेटकर और अपवाद लॉग इन करके (कम से कम आंशिक रूप से) इससे बच सकते हैं।

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

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

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