หากคุณต้องการเรียนรู้เทคโนโลยีเพจแบบอะซิงโครนัสของ Asp.Net2.0 คุณต้องอ่าน http://www.microsoft.com/china/MSDN/library/default.mspx?mfr=true อย่างละเอียด และดาวน์โหลดซอร์สโค้ดและ ศึกษามันอย่างระมัดระวัง ข้อความฉบับเต็มแนะนำโมเดลการเขียนโปรแกรมทั้งหมด 3 โมเดลสำหรับการนำเพจอะซิงโครนัสไปใช้ และแต่ละโมเดลมีฟังก์ชันที่ทรงพลังมากกว่าโมเดลอื่น ฉันจะไม่พูดอะไรมากไปกว่านี้ เรามาดูโมเดลล่าสุดกันดีกว่า: ใช้คลาส PageAsyncTask, วิธี RegisterAsyncTask, วิธี ExecuteRegisteredAsyncTasks และวิธีการ TimeoutAsyncOperation เพื่อลงทะเบียนและดำเนินการงานแบบอะซิงโครนัส และเรียกใช้วิธีประมวลผลการหมดเวลาเป็นเวลานานโดยไม่มีการตอบสนอง ไฟล์ AsyncPageTask.aspx.cs ของซอร์สโค้ดที่ให้ไว้ในบทความต้นฉบับมีตัวอย่างโดยละเอียดของวิธีใช้โมเดลนี้เพื่อใช้งานเพจแบบอะซิงโครนัส
ข้อได้เปรียบที่ใหญ่ที่สุดของโมเดลนี้คือสามารถจัดการงานอะซิงโครนัสหลายงานได้ในคำขอเพจเดียว และยังสามารถใช้การประมวลผลการหมดเวลาเพื่อหลีกเลี่ยงการไม่ตอบสนองเมื่อดำเนินการแบบอะซิงโครนัส ผู้เขียนต้นฉบับลงทะเบียนเฉพาะงานอะซิงโครนัสใน Page_Load เท่านั้น ดังนั้นเราจึงทำตามตัวอย่างของเขาและลงทะเบียนงานอะซิงโครนัสอื่น ดังที่แสดงด้านล่าง:
<%@ หน้า Async = "true" AsyncTimeout = "5" ภาษา = "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)
โมฆะ
);
PageAsyncTask ภารกิจ 1 = PageAsyncTask ใหม่ (
ใหม่ BeginEventHandler (BeginAsyncOperation1)
ใหม่ EndEventHandler (EndAsyncOperation1)
ใหม่ EndEventHandler (TimeoutAsyncOperation1)
โมฆะ
);
RegisterAsyncTask (งาน);
ลงทะเบียนAsyncTask(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)
โมฆะ
);
PageAsyncTask ภารกิจ 1 = PageAsyncTask ใหม่ (
ใหม่ BeginEventHandler (BeginAsyncOperation1)
ใหม่ EndEventHandler (EndAsyncOperation1)
ใหม่ EndEventHandler (TimeoutAsyncOperation1)
โมฆะ
);
RegisterAsyncTask (งาน);
ดำเนินการลงทะเบียนAsyncTasks();
ลงทะเบียนAsyncTask(task1);
ดำเนินการลงทะเบียนAsyncTasks();
-
-
เมื่อมองแวบแรก ดูเหมือนว่าจะมีปัญหา: วิธี ExecuteRegisteredAsyncTasks ที่สองจะรันงานอะซิงโครนัสที่ลงทะเบียนครั้งแรกอีกครั้งหรือไม่ จริงๆ แล้วไม่ เพราะ Asp.net2.0 ได้กำหนดว่าวิธีอะซิงโครนัสเดียวกันจะถูกดำเนินการเพียงครั้งเดียวเท่านั้น ดังนั้นงานอะซิงโครนัสทั้งสองจึงมีเวลาทำงานเฉพาะและหลีกเลี่ยงการรบกวนซึ่งกันและกัน
http://www.cnblogs.com/taewind/archive/2006/12/22/600687.html