سؤال

خذ بعين الاعتبار هذا الكود...

using System.Threading;
//...
Timer someWork = new Timer(
    delegate(object state) {
        //Do some work here...
    },
    null, 0, 60000);

HttpContext.Current.Application["SomeWorkItem"] = someWork;

هل يمكن أن يكون هذا خطيرًا؟يبدو التخزين المؤقت للمؤقت في التطبيق لأداء بعض الأعمال في الخلفية أثناء تشغيل موقعك آمنًا، لكنني أتساءل عما إذا كان لدى أي شخص بعض الخبرة في هذا الأمر.

أنا متأكد من أن كتابة خدمة ليتم تشغيلها في الخلفية سيكون بالتأكيد أفضل بكثير، ولكن في بعض الأحيان لا يكون هذا خيارًا دائمًا.هل هذا بديل؟

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

المحلول

ستكون هذه فكرة سيئة بشكل عام، حيث يستخدم System.Threading.Timer سلاسل رسائل من ThreadPool، مثل ASP.Net.

إذا قام مندوب المؤقت الخاص بك بحظر أو توقف لأي سبب من الأسباب، فسيبدأ المؤقت ببساطة سلسلة رسائل جديدة بعد فترة المهلة، مما يؤثر على سلاسل الرسائل المتوفرة لـ ASP.net.

إذا بدأوا جميعًا في الحظر، فلن تتمكن فعليًا من تلبية أي طلبات ويب أخرى (ربما يكون ذلك أمرًا سيئًا)

نصائح أخرى

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

إذا كنت بحاجة إلى إنجاز هذا العمل، فستحتاج إما إلى ترميزه في مكالمة ويب، أو تشغيل خدمة في خلفية الخادم.

قد يكون ذلك خطيرًا لأنه قد تكون هناك أوقات تتم فيها إعادة تدوير العملية المنفذة أو يتعطل AppDomain ويتوقف عنصر العمل وقد ترغب في استرداد ما كان يفعله، وقد لا يكون ذلك ممكنًا.

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

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

إجابات جيدة، أنا فقط أشعر بالفضول لمعرفة المزيد عن كيفية عمل ذلك من الداخل.

أنصحك بإعداد مهمة مجدولة لتشغيل صفحة على موقعك.عادةً ما أقوم بتوجيه المهمة المجدولة إلى ملف .vbs بما يلي:

On Error Resume Next
Dim objRequest
Dim URL

Set objRequest = CreateObject("Microsoft.XMLHTTP")
URL = "http://www.mywebsite.com/cron/pagetorun.ashx"

objRequest.open "POST", URL , false

objRequest.Send

Set objRequest = Nothing

لدى عمر الزبير مقالة ممتازة حول استخدام عمليات الاسترجاعات الخاصة بعناصر ذاكرة التخزين المؤقت لهذا الغرض.

http://www.codeproject.com/KB/aspnet/ASPNETService.aspx?fid=229682&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=76&select=1334820

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