ฟังก์ชันการรีเฟรชเพจแบบอะซิงโครนัสของ ASP.NET 2.0 นั้นยอดเยี่ยมมาก ฉันพยายามใช้มันเพื่อแก้ไขปัญหาแอปพลิเคชันของฉันในวันนี้ และมันช่วยได้มากจริงๆ
เพจของฉันต้องส่งข้อความค้นหาไปยังบริการซ็อกเก็ตในเบื้องหลัง ประการแรก นี่เป็นการดำเนินการที่อาจไม่ส่งคืนมาเป็นเวลานาน เพื่อให้ได้ความยาวผันแปรและข้อมูลการตอบสนองขนาดใหญ่ที่ส่งคืนโดยซ็อกเก็ต ฉันต้องใช้ dotNET IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state); วิธีการส่งคำสั่งซ็อกเก็ตแบบอะซิงโครนัส จากนั้นเรียกซ้ำ int EndReceive(IAsyncResult asyncResult) ; ในฟังก์ชันการโทรกลับเพื่อรับข้อมูลการตอบสนอง ชุดข้อมูลส่วนนี้จะถูกแคชไว้ในรายการเชื่อมโยง MemoryBlock จนกว่าจะดึงข้อมูลออกมา
ในกรณีนี้ ถ้าเพจ ASP.NET ต้องการแสดงข้อมูลการตอบสนองในตาราง จะต้องรีเฟรชแบบอะซิงโครนัส
ASP.NET 1.x ไม่รองรับเพจแบบอะซิงโครนัส แต่ด้วยความอุตสาหะและนวัตกรรม ทำให้สามารถสร้างเพจแบบอะซิงโครนัสได้ สำหรับข้อมูลภาพรวมเพิ่มเติม โปรดดูบทความนิตยสาร MSDN® เดือนมิถุนายน 2546 เรื่อง "ใช้เธรดและสร้างตัวจัดการแบบอะซิงโครนัสในโค้ดเว็บฝั่งเซิร์ฟเวอร์ของคุณ" โดย Fritz Onion
แต่ ASP.NET 2.0 ทำให้วิธีการสร้างเพจแบบอะซิงโครนัสง่ายขึ้นอย่างมาก ขั้นแรกให้ใช้คำสั่ง @ Page ของเพจเพื่อแนะนำแอตทริบิวต์ Async="true"
ประการที่สอง เมื่อ Page_Load ให้ลงทะเบียนเหตุการณ์ Page_PreRender:
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
// ดำเนินการเมธอดเมื่อเหตุการณ์การลงทะเบียน Page_PreRender เสร็จสมบูรณ์
// Hook PreRenderComplete เหตุการณ์สำหรับการเชื่อมโยงข้อมูล
นี้ .PreRenderComplete += EventHandler ใหม่ (Page_PreRenderComplete);
ต่อไป ฉันเริ่มต้นการเดินทางของการดำเนินการแบบอะซิงโครนัสในฟังก์ชันเหตุการณ์การคลิกปุ่ม:
/// เมธอด PageAsyncTask เป็นเวอร์ชันที่ได้รับการปรับปรุง นอกเหนือจากวิธีการเริ่มต้นและสิ้นสุดการประมวลผลเพจแบบอะซิงโครนัสเอง
/// ยังสามารถจัดเตรียมวิธีการประมวลผลแบบหมดเวลาได้อีกด้วย ของสถานการณ์และออบเจ็กต์สถานะเมื่อประมวลผล
///
งาน PageAsyncTask = PageAsyncTask ใหม่ (
BeginEventHandler ใหม่ (BeginSubmitKeywordsAsyncOperation),
EndEventHandler ใหม่ (EndSubmitKeywordsAsyncOperation),
EndEventHandler ใหม่ (TimeoutSubmitKeywordsAsyncOperation),
null
);
RegisterAsyncTask (งาน);
/// สำหรับสถานการณ์การประมวลผลแบบอะซิงโครนัสที่ง่ายที่สุด คุณสามารถเรียกใช้เมธอด AddOnPreRenderCompleteAsync ได้โดยตรง
/// ส่งโค้ดการประมวลผลที่จุดเริ่มต้นและจุดสิ้นสุดของคำขอเพจ
//AddOnPreRenderCompleteAsync(
// new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),
// new EndEventHandler (EndSubmitKeywordsAsyncOperation)
//);
หน้าเว็บจะเข้าสู่วงจรการประมวลผลปกติจนกระทั่งหลังจากเหตุการณ์ PreRender เกิดขึ้นไม่นาน จากนั้น ASP.NET เรียกเมธอด Begin BeginSubmitKeywordsAsyncOperation ที่ลงทะเบียนโดยใช้ RegisterAsyncTask ในวิธีนี้ ฉันจะส่งคำสั่งของฉันไปยังบริการ sokcet แล้วส่งคืนวัตถุ IasyncResult ที่ได้รับจากวิธี socket.BeginReceive ไปยัง ASP.NET
จากนั้น หลังจากที่ฟังก์ชันการเรียกกลับแบบอะซิงโครนัสของซ็อกเก็ตของฉันได้รับสตรีมข้อมูลทั้งหมดในที่สุด
ระบบจะแจ้งให้เพจทราบว่าซ็อกเก็ตทำงานเสร็จเรียบร้อยแล้ว
โดยการเรียกcallback.Invoid(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 /zhengyun_ustc/archive/2006/08/08/asp_net_2_0_pageasynctask.html