هل تستطيع صفحة ASP.NET القيام ببعض المعالجات بعد انتهاء التحميل؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

لدي صفحة ASP.NET التي تستغرق وقتا طويلا لتحميل. القليل من الاختبارات يدل على أن جانب الخادم يتم تسجيل التسجيل جزءا عادلا للوقت و (لأن المستخدم لا يحتاج أبدا إلى رؤية نتائج التسجيل) أريد تأخيره إلا بعد تحميل الصفحة.

هل هناك طريقة بسيطة للقيام بذلك؟

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

انا ليس تبحث عن اياكس. أريد أن أقوم بتحميل صفحات كاملة عادية ثم بعد تحميل الصفحة (كما هو موضح من جانب العميل) القيام بمعالجة أكثر قليلا.

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

المحلول

يبدو أن هذا يعمل:

protected void Page_Unload(object sender, EventArgs e)
{
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.Close();
    Thread.Sleep(20000); // Do processing here instead of sleeping :)
    Debug.WriteLine("Done!");
}

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

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

نصائح أخرى

هل فكرت في إنشاء خدمة تسجيل تأخذ قائمة انتظار الرسائل لتسجيل الدخول وإجراء تسجيل الدخول فقط في مؤشر ترابطه الخاص؟

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

أنت تبحث عن عملية غير متزامنة. AJAX يسمح بذلك وكذلك التطبيقات الأخرى. قم بعمل البحث عن ASYNC و ASP.NET وستجد الكثير من الموارد.

أساسا صفحة الويب الخاصة بك تبدأ وتشغيل العمليات في مؤشر ترابط منفصل بينما تواصل UI تقديمها.

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

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

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

ربما سيساعدك هذا Howto:

http://www.eggheadcafe.com/articles/20060918.asp.

الأمل يمكن أن تساعدك

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

يمكنك تفقد التسجيل، إذا فشلت الصفحة في تحميلها بسبب الاستثناء.
عفوا عني، إذا لم أفهم المشكلة بشكل صحيح.

أي نوع من التسجيل هو ومن أين الحال؟

قد يكون في إحدى الطرق هو تدور حول مؤشر ترابط آخر (كنت بحاجة إلى زيادة كمية المواضيع المتاحة ل ASP.NET) وإجراء تسجيل الدخول هناك. يمكنك استخدام ParameterizedThreadStart وأرمر كائن لاستخدامه في التسجيل. (لا تمر بنقل قاعدة بيانات / كائن أمر على الرغم من أنه سيكون سيئا!)

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