إن وظيفة تحديث الصفحة غير المتزامنة في ASP.NET 2.0 رائعة حقًا، وقد حاولت استخدامها لحل إحدى مشكلات التطبيقات الخاصة بي اليوم، وقد ساعدتني كثيرًا حقًا.
تحتاج صفحتي إلى إرسال استعلام إلى خدمة المقبس في الخلفية، أولاً وقبل كل شيء، هذه عملية قد لا تعود لفترة طويلة. ثانيًا، من أجل الحصول على الطول المتغير وبيانات الاستجابة الكبيرة التي يمكن إرجاعها بواسطة المقبس الخدمة، لا بد لي من استخدام dotNET.IAsyncResult BeginReceive(byte[] buffer, int offset, int size,ocketFlags مقبسFlags, AsyncCallback callback, object State); ؛ في وظيفة رد الاتصال للحصول على بيانات الاستجابة حتى يتم جلب البيانات، يتم تخزين هذه السلسلة من أجزاء البيانات مؤقتًا في قائمة مرتبطة بـ MemoryBlock.
في هذه الحالة، إذا كانت صفحة ASP.NET تريد عرض بيانات الاستجابة في جدول، فيجب تحديثها بشكل غير متزامن.
لا يدعم ASP.NET 1.x الصفحات غير المتزامنة بطبيعتها، ولكن من خلال المثابرة والابتكار، يمكن إنشاء صفحات غير متزامنة. لمزيد من المعلومات العامة، راجع مقال مجلة MSDN® الصادر في يونيو 2003 بعنوان "استخدام سلاسل الرسائل وإنشاء معالجات غير متزامنة في كود الويب الخاص بالخادم"، بقلم فريتز أونيون.
لكن ASP.NET 2.0 يبسط إلى حد كبير طريقة إنشاء صفحات غير متزامنة. استخدم أولاً توجيه @ Page الخاص بالصفحة لتقديم السمة Async = "true".
ثانيًا، عند تحميل Page_Load، قم بتسجيل الحدث Page_PreRender:
Private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
// تنفيذ الطريقة عند اكتمال حدث التسجيل Page_PreRender
// ربط حدث PreRenderComplete لربط البيانات
بهذا .PreRenderComplete += new EventHandler(Page_PreRenderComplete);
بعد ذلك، بدأت رحلتي العملية غير المتزامنة في وظيفة حدث النقر على الزر:
/// طريقة PageAsyncTask هي إصدار محسّن، بالإضافة إلى طرق بدء ونهاية معالجة الصفحة غير المتزامنة نفسها،
يمكن أن يوفر /// أيضًا مهلة لطريقة المعالجة الوضع، وكائن الحالة عند المعالجة.
///
PageAsyncTask Task = new PageAsyncTask(
new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),
new EndEventHandler(EndSubmitKeywordsAsyncOperation),
new EndEventHandler(TimeoutSubmitKeywordsAsyncOperation),
null
)
;
/// بالنسبة لمعظم حالات المعالجة غير المتزامنة البسيطة، يمكنك الاتصال مباشرة بطريقة AddOnPreRenderCompleteAsync،
/// إرسال رمز المعالجة في بداية ونهاية الصفحة طلب
//AddOnPreRenderCompleteAsync(
// new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),
// new EndEventHandler (EndSubmitKeywordsAsyncOperation)
//);
تمر الصفحة بدورة حياة المعالجة العادية حتى بعد ظهور حدث PreRender مباشرة. بعد ذلك، يقوم ASP.NET باستدعاء الأسلوب Begin BeginSubmitKeywordsAsyncOperation المسجل باستخدام RegisterAsyncTask. في هذه الطريقة، سأرسل الأمر الخاص بي إلى خدمة sokcet، ثم أرجع كائن IasyncResult الذي تم الحصول عليه بواسطة طريقة المقبس.BeginReceive إلى ASP.NET.
بعد ذلك، بعد أن تحصل وظيفة رد الاتصال غير المتزامن للمقبس على جميع تدفقات البيانات،
تقوم بإعلام الصفحة بأن المقبس قد أكمل العمل
عن طريق استدعاءcallback.Invoc(result);.
لذلك يستدعي ASP.NET طريقة EndSubmitKeywordsAsyncOperation:
/// <summary>
/// طريقة الاستلام بعد اكتمال المكالمة غير المتزامنة (بعد اكتمال العملية غير المتزامنة، سيتم أخذ مؤشر ترابط من تجمع مؤشرات الترابط لخدمة طلب الصفحة ///
</summary>
/// <param name="ar"></param>
void EndSubmitKeywordsAsyncOperation(IAsyncResult ar)
{
_resultDataset =_submit.getResultDataset
(ar);
.
بعد ذلك، يقوم ASP.NET باستدعاء حدث Page_PreRender مرة أخرى، بحيث يمكن في هذا الحدث ملء الجدول الموجود على الصفحة بشكل صحيح.
وبهذه الطريقة تم تحقيق هدفي. علاوة على ذلك، إذا انتهت مهلة انتظار إعادة التنشيط بعد الإرسال إلى الخلفية،
فيمكن أيضًا استخدامTimeoutSubmitKeywordsAsyncOperation(IAsyncResult ar) الفارغة
للتعامل معها بشكل مناسب.
الموارد المرجعية:
1:
الصفحات غير المتزامنة في ASP.NET 2.0
http://www.microsoft.com/china/msdn/library/webservices/asp.net/issuesWickedCodetoc.mspx?mfr=true
http://www.cnblogs com /zhengyun_ustc/archive/2006/08/08/asp_net_2_0_pageasynctask.html