ما هي أفضل طريقة للتعامل مع العمليات الطويلة الأمد في تطبيق ASP.Net؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

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

لقد انخرطت في ربط العملية وقرأت أنه يجب عليّ مزامنتها مع خدمة ويب ("أطلق وانسى").

بعض المراجع التي قرأتها:
- MSDN
- النار وننسى

لذا سؤالي هو - ما هي أفضل طريقة؟

تحديث:بعد أن يقوم المستخدم بإدخال بياناته، أود إعادة توجيهه إلى صفحة النتائج التي يتم تحديثها بشكل متزايد أثناء تشغيل العملية في الخلفية.

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

المحلول

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

في الموقف الخاص بك، قد ترغب في استخدام استدعاء LongRunningProcess.aspx واحد لكل مهمة، لتجنب انتهاء مهلات الصفحة.

على سبيل المثال، اتصل بـ LongRunningProcess.aspx?taskID=1 لبدء المهمة ثم في نهاية هذه المهمة، قم بإصدار رسالة

document.location = "LongRunningProcess.aspx?taskID=2".  

الغثيان الإعلاني.

نصائح أخرى

واجهنا مشكلة مماثلة وقمنا بحلها عن طريق بدء العمل عبر مكالمة خدمة ويب غير متزامنة (مما يعني أنه لم يكن على المستخدم الانتظار حتى انتهاء العمل).بدأت خدمة الويب بعد ذلك مهمة SQL التي نفذت العمل وقامت بشكل دوري بتحديث جدول بحالة العمل.لقد قدمنا ​​واجهة مستخدم تسمح للمستخدم بالاستعلام عن الجدول.

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

  1. كيف يتم الاستعلام عن البيانات البعيدة؟
  2. كم مرة يتغير؟
  3. هل النتائج شيء يمكن تخزينه مؤقتًا لفترة من الوقت؟
  4. ما هي الفترة الزمنية التي نتحدث عنها بالفعل هنا؟

من المرجح أن تعتمد "الطريقة الأفضل" بطريقة ما على إجابات هذه الأسئلة...

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

كان الحل الخاص بي لهذا هو خدمة خارج النطاق تقوم بذلك وتخزنها مؤقتًا في قاعدة البيانات.

عندما يطلب الشخص شيئًا ما في المرة الأولى، فإنه ينتظر قليلًا، ثم يظهر، لكن إذا قام بالتحديث، فهو فوري، وبعد ذلك، لأنه int he db، أصبح الآن جزءًا من التحديث كل ساعة لليوم التالي 24 ساعة من آخر طلب.

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

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

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