Application_end وعمليات الخلفية ، والخروج من تطبيق ASP.NET بأمان

StackOverflow https://stackoverflow.com/questions/4617613

سؤال

لدي تطبيق ASP.NET الذي يطلق بعض عمال الخلفية باستخدام ThreadPool.QueueUserWorkItem (). في معظم الأوقات ، سيتم تشغيل مؤشرات ترابط خلفية صفرية ، ولكن من الممكن أن يكون هناك ما يصل إلى 5-6 تنفيذ في وقت واحد. بالإضافة إلى ذلك ، سوف يكتمل معظمهم في غضون بضع ثوان ، ولكن من الممكن أن يتمكنوا من الركض لمدة تصل إلى 10 دقائق.

بالنظر إلى جميع السيناريوهات المختلفة التي يمكن أن تتسبب في إيقاف تشغيل تطبيق ASP.NET ، أود أن تخرج عمليات الخلفية هذه بأمان إذا كان ذلك ممكنًا عندما يحتاج التطبيق إلى إيقاف تشغيله وهو في منتصف المعالجة.

لا أتوقع وجود الكثير من مشكلة في خلق طريقة للإشارة إلى العمليات لإيقاف عملهم مبكرًا والتنظيف في غضون بضع ثوان من الحصول على المكالمة التي يتم إيقافها. على الرغم من أنه إذا كان لدى أي شخص نصيحة محددة حول هذا ، فأنا أقدر ذلك بالتأكيد.

سؤالي الرئيسيين هما:

1) متى سيكون الوقت المناسب لإخبار عمال الخلفية بلف الأشياء. أثناء Application_end؟ تخلص()؟ أو ربما خيار ثالث لست على علم به.

2) إذا انتظرت أثناء الحدث أعلاه حتى تنتهي العمليات قبل العودة ، فهل هناك نقطة يمكن أن تتسبب فيها عدم وجود Application_end على الفور في مشكلات أكثر خطورة للتطبيق بدلاً من عدم إيقاف وظائف الخلفية بشكل جيد.

void Application_End(object sender, EventArgs e) 
{
    //if this for whatever reason takes a non-trivial time to execute, what problems could I encounter? 
    SignalBackgroundJobsAndWaitForThemToShutDown();
}

شكرًا!

هل كانت مفيدة؟

المحلول

الوقت المناسب هو على application_end

الآن بعد أن تشير إلى وظائف الخلفية الخاصة بك ، يجب أن تنتظرها في تلك المرحلة إلى النهاية ، ثم اتركها ، كما يبدو أنك تفعل ذلك.

احصل على ذلك ، من الجيد وضع وقت في الانتظار ، ولا تنتظر إلى الأبد وإلا فإن حمام السباحة الخاص بك قد يواجه مشاكل ، أو إيقاف التشغيل ، ثم تحتاج إلى التحقق قيمة أكبر من انتظارك ، أو فقط تعطيلها.

لديك أيضًا أنه إذا كان لديك حمام سباحة حديقة ، (أكثر من وحدات عمل واحدة) ، فإن Application_end تسمى مرة واحدة لكل حمام سباحة.

أستخدم نفس التقنية في مواقعي ، بنفس الطريقة التي أشرت بها إلى إيقاف الخيوط الخاصة بي بنفس الطريقة ، أقوم أيضًا بتسجيل النهاية النهائية ، والتحقق من ذلك عندما تكون النهاية النهائية ، وأجبر أيضًا روتيناتي على التوقف وعدم السماح لهم ركض لعدة الوقت. يتم استدعاء Application_end على إعادة تدوير التجمع ، أو عند فتح ملف app_offline.htm ، أو عند الانتقال إلى إغلاق خدمة الويب. أنا شخصياً قمت بتعطيل إعادة التدوير ، ولا أحتاج إليها وأنا أفتح فقط app_offline.htm عندما أقوم بإجراء تحديثات. في تلك اللحظة أنتظر خيوط حمام السباحة الخاصة بي لإيقاف عملهم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top