إذا كنت تريد تعلم تقنية الصفحات غير المتزامنة الخاصة بـ Asp.Net2.0، فيجب عليك قراءة http://www.microsoft.com/china/MSDN/library/default.mspx?mfr=true بعناية، وتنزيل التعليمات البرمجية المصدر الخاصة بها وتنزيلها. دراستها بعناية. يقدم النص الكامل إجمالي 3 نماذج برمجة لتنفيذ الصفحات غير المتزامنة، ولكل منها وظائف أقوى من الأخرى. لن أقول المزيد، دعنا نلقي نظرة على النموذج الأخير: استخدم فئة PageAsyncTask وطريقة RegisterAsyncTask وطريقة ExecuteRegisteredAsyncTasks وطريقة TimeoutAsyncOperation لتسجيل وتنفيذ المهام غير المتزامنة، واستدعاء طريقة معالجة المهلة لفترات طويلة من عدم الاستجابة. يوفر ملف AsyncPageTask.aspx.cs الخاص بكود المصدر المتوفر في المقالة الأصلية مثالاً تفصيليًا لكيفية استخدام هذا النموذج لتنفيذ الصفحات غير المتزامنة.
أكبر ميزة لهذا النموذج هو أنه يمكنه التعامل مع مهام غير متزامنة متعددة في طلب صفحة واحدة، ويمكن أيضًا استخدام معالجة المهلة لتجنب عدم الاستجابة عند إجراء عمليات غير متزامنة. قام المؤلف الأصلي بتسجيل مهمة غير متزامنة فقط في Page_Load، لذلك نتبع مثاله ونسجل مهمة أخرى غير متزامنة، كما هو موضح أدناه:
<%@ Page Async = "true" AsyncTimeout = "5" Language = "C#" MasterPageFile = "~/Site.master" AutoEventWireup = "true" CodeFile = "AsyncPageTask.aspx.cs" يرث = "AsyncPageTask" Title = " صفحة بلا عنوان" %>
Page_Load باطلة محمية (مرسل الكائن، EventArgs e)
{
إذا (!IsPostBack)
{
مهمة PageAsyncTask = PageAsyncTask جديد (
BeginEventHandler الجديد (BeginAsyncOperation)،
EndEventHandler الجديد (EndAsyncOperation)،
EndEventHandler جديد (TimeoutAsyncOperation)،
باطل
)
;
BeginEventHandler الجديد (BeginAsyncOperation1)،
EndEventHandler الجديد (EndAsyncOperation1)،
EndEventHandler جديد (TimeoutAsyncOperation1)،
باطل
)
;
RegisterAsyncTask(task1);
}
}
إذا تم الحصول على النتيجة التي تم إرجاعها بواسطة المهمة غير المتزامنة خلال الوقت المحدد لسمة الصفحة AsyncTimeout، فسيتم عرض الصفحة كما توقعنا. ولكن ماذا يحدث إذا واجهت مشكلة صغيرة أثناء أداء مهمتك الأولى وخسرت الوقت؟ هناك احتمالان: أولاً، يتم إرجاع نتيجة المهمة الأولى وعرضها أخيرًا، ويتم الحكم على المهمة الثانية بأنها انتهت مهلتها بمجرد بدءها، وبالتالي يتم تنفيذ طريقة TimeoutAsyncOperation الخاصة بها، وثانيًا، لا يتم تنفيذ المهمة الأولى؛ تم الحكم عليها بالمهلة بحلول الوقت الذي يتم فيه إرجاع النتيجة، لذلك يجب أيضًا الحكم على المهمة الثانية بالمهلة. يرجع الموقف أعلاه إلى أن المهمتين غير المتزامنتين تتقاسمان الوقت المحدد بواسطة AsyncTimeout. وطالما تأخرت المهمة السابقة أثناء التنفيذ، فسيؤثر ذلك حتمًا على تشغيل المهمة اللاحقة. فهل يمكن لمهمتين غير متزامنتين الوصول بشكل خاص إلى الوقت المحدد بواسطة AsyncTimeout؟ وهذا يتطلب إيجاد طريقة من خلال طريقة ExecuteRegisteredAsyncTasks.
تجدر الإشارة إلى أن Asp.net2.0 سيقوم بإعادة تعيين خاصية AsyncTimeout في كل مرة يتم فيها استدعاء ExecuteRegisteredAsyncTasks، مما يعني أنه من الممكن تحقيق مهمة غير متزامنة حصرية للوقت المحدد بواسطة AsyncTimeout. وفقًا للطريقة الحالية لكتابة البرنامج، إذا لم يتم استدعاء الأسلوب ExecuteRegisteredAsyncTasks بشكل صريح، فسيقوم Asp.net2.0 باستدعاء PreRenderComplete في دورة حياة الصفحة.
يتم استدعاء الأسلوب ExecuteRegisteredAsyncTasks تلقائيًا قبل الحدث لتشغيل المهمتين غير المتزامنتين المسجلتين. نظرًا لأنه يتم تنفيذ ExecuteRegisteredAsyncTasks مرة واحدة فقط ولكن يتم تشغيل مهمتين، فيجب أن تشترك المهمتان في وقت التشغيل المحدد بواسطة AsyncTimeout. لذلك قمت بإجراء التعديلات التالية على الكود:
protected void Page_Load(object sender, EventArgs e)
{
إذا (!IsPostBack)
{
مهمة PageAsyncTask = PageAsyncTask جديد (
BeginEventHandler الجديد (BeginAsyncOperation)،
EndEventHandler الجديد (EndAsyncOperation)،
EndEventHandler جديد (TimeoutAsyncOperation)،
باطل
)
;
BeginEventHandler الجديد (BeginAsyncOperation1)،
EndEventHandler الجديد (EndAsyncOperation1)،
EndEventHandler جديد (TimeoutAsyncOperation1)،
باطل
)
;
ExecuteRegisteredAsyncTasks();
RegisterAsyncTask(task1);
ExecuteRegisteredAsyncTasks();
}
}
للوهلة الأولى، يبدو أن هناك مشكلة: هل ستقوم الطريقة الثانية ExecuteRegisteredAsyncTasks بتنفيذ أول مهمة غير متزامنة مسجلة مرة أخرى؟ في الواقع لا، لأن Asp.net2.0 نص على أنه سيتم تنفيذ نفس الطريقة غير المتزامنة مرة واحدة فقط. ولذلك، فإن المهمتين غير المتزامنتين لهما وقت تشغيل حصري وتجنب التداخل المتبادل.
http://www.cnblogs.com/taewind/archive/2006/12/22/600687.html