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" Inherits="AsyncPageTask" Title=" 제목 없는 페이지" %>
protected void Page_Load(개체 전송자, EventArgs e)
{
if (!IsPostBack)
{
PageAsyncTask 작업 = 새로운 PageAsyncTask(
새로운 BeginEventHandler(BeginAsyncOperation),
새로운 EndEventHandler(EndAsyncOperation),
새로운 EndEventHandler(TimeoutAsyncOperation),
null
);
PageAsyncTask task1 = 새로운 PageAsyncTask(
새로운 BeginEventHandler(BeginAsyncOperation1),
새로운 EndEventHandler(EndAsyncOperation1),
새로운 EndEventHandler(TimeoutAsyncOperation1),
null
);
RegisterAsyncTask(작업);
RegisterAsyncTask(task1);
}
}
페이지 속성 AsyncTimeout의 지정된 시간 내에 비동기 작업에서 반환된 결과를 얻으면 페이지가 예상대로 표시됩니다. 하지만 첫 번째 작업을 수행하는 동안 약간의 문제가 발생하여 시간을 낭비한다면 어떻게 될까요? 두 가지 가능성이 있습니다. 첫째, 첫 번째 작업의 결과가 최종적으로 반환되어 표시되고, 두 번째 작업은 시작되자마자 시간 초과된 것으로 판단되어 TimeoutAsyncOperation 메서드를 실행합니다. 두 번째, 첫 번째 작업은 그렇지 않습니다. 결과가 반환될 때 시간 초과가 선고되었으므로 두 번째 작업도 시간 초과가 선고되어야 합니다. 위 상황은 AsyncTimeout에 지정된 시간을 공유하는 두 개의 비동기 작업으로 인해 발생합니다. 실행 중에 이전 작업이 지연되면 필연적으로 후속 작업의 작동에 영향을 미치게 됩니다. 그러면 두 개의 비동기 작업이 AsyncTimeout에 지정된 시간에 단독으로 액세스할 수 있습니까? 이를 위해서는 ExecuteRegisteredAsyncTasks 메서드를 통해 방법을 찾아야 합니다.
Asp.net2.0은 ExecuteRegisteredAsyncTasks가 호출될 때마다 AsyncTimeout 속성을 재설정한다는 점은 주목할 가치가 있습니다. 이는 AsyncTimeout에 지정된 시간 동안 독점적인 비동기 작업을 달성할 수 있음을 의미합니다. 현재 프로그램 작성 방식에 따르면 ExecuteRegisteredAsyncTasks 메서드가 명시적으로 호출되지 않으면 Asp.net2.0은 페이지 수명 주기에서 PreRenderComplete를 호출합니다.
ExecuteRegisteredAsyncTasks 메서드는 등록된 두 개의 비동기 작업을 실행하기 위해 이벤트 전에 자동으로 호출됩니다. ExecuteRegisteredAsyncTasks는 한 번만 실행되지만 두 개의 작업이 실행되므로 두 작업은 AsyncTimeout에 지정된 실행 시간을 공유해야 합니다. 그래서 코드를 다음과 같이 조정했습니다.
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
PageAsyncTask 작업 = 새로운 PageAsyncTask(
새로운 BeginEventHandler(BeginAsyncOperation),
새로운 EndEventHandler(EndAsyncOperation),
새로운 EndEventHandler(TimeoutAsyncOperation),
null
);
PageAsyncTask task1 = 새로운 PageAsyncTask(
새로운 BeginEventHandler(BeginAsyncOperation1),
새로운 EndEventHandler(EndAsyncOperation1),
새로운 EndEventHandler(TimeoutAsyncOperation1),
null
);
RegisterAsyncTask(작업);
ExecuteRegisteredAsyncTasks();
RegisterAsyncTask(task1);
ExecuteRegisteredAsyncTasks();
}
}
언뜻 보면 문제가 있는 것 같습니다. 두 번째 ExecuteRegisteredAsyncTasks 메서드가 처음으로 등록된 비동기 작업을 다시 실행합니까? 실제로는 아닙니다. Asp.net2.0에서는 동일한 비동기 메서드가 한 번만 실행되도록 규정했기 때문입니다. 따라서 두 비동기 작업은 독점적인 실행 시간을 갖고 상호 간섭을 방지합니다.
http://www.cnblogs.com/taewind/archive/2006/12/22/600687.html