ASP.NET 2.0의 비동기 페이지 새로 고침 기능은 정말 훌륭합니다. 오늘 제가 겪고 있는 응용 프로그램 문제를 해결하기 위해 이 기능을 사용해 보았는데 정말 많은 도움이 되었습니다.
내 페이지는 백그라운드에서 소켓 서비스에 쿼리를 제출해야 합니다. 우선 이 작업은 오랫동안 반환되지 않을 수 있습니다. 둘째, 소켓에서 반환되는 가변 길이 및 큰 응답 데이터를 가져오기 위한 것입니다. 서비스의 경우 dotNET.IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlagssocketFlags, AsyncCallback callback, object state) 메서드를 사용하여 소켓 명령을 비동기적으로 제출한 다음 int EndReceive(IAsyncResult asyncResult)를 반복적으로 호출해야 합니다. ; 응답 데이터를 얻기 위한 콜백 함수에서 데이터를 가져올 때까지 이 일련의 데이터 조각은 MemoryBlock 연결 목록에 캐시됩니다.
이 경우 ASP.NET 페이지에서 응답 데이터를 테이블에 표시하려면 비동기적으로 새로 고쳐야 합니다.
ASP.NET 1.x는 본질적으로 비동기 페이지를 지원하지 않지만 인내와 혁신을 통해 비동기 페이지를 생성할 수 있습니다. 자세한 개요 정보는 Fritz Onion이 쓴 2003년 6월 MSDN® Magazine 기사 "서버측 웹 코드에서 스레드 사용 및 비동기 처리기 구축"을 참조하십시오.
그러나 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
)
RegisterAsyncTask(task);
/// 대부분의 간단한 비동기 처리 상황에서는 AddOnPreRenderCompleteAsync 메서드를 직접 호출할 수 있습니다.
/// 페이지 요청의 시작과 끝에서 처리 코드를 제출합니다.
//AddOnPreRenderCompleteAsync(
// new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),
// new EndEventHandler (EndSubmitKeywordsAsyncOperation)
//);
페이지는 PreRender 이벤트가 발생한 직후까지 정상적인 처리 수명 주기를 거칩니다. 그런 다음 ASP.NET은 RegisterAsyncTask를 사용하여 등록된 Begin 메서드 BeginSubmitKeywordsAsyncOperation을 호출합니다. 이 메서드에서는 명령을 sokcet 서비스에 제출한 다음, 소켓.BeginReceive 메서드에서 얻은 IasyncResult 개체를 ASP.NET에 반환합니다.
그런 다음 소켓 비동기 콜백 함수가 마침내 모든 데이터 스트림을 얻은 후
callback.Invoke(result);를
호출하여소켓이 작업을 완료했음을 페이지에 알립니다
.따라서 ASP.NET은 EndSubmitKeywordsAsyncOperation 메서드를 호출합니다.
/// <summary>
/// 비동기 호출이 완료된 후 수신 메서드(비동기 작업이 완료된 후 페이지 요청을 처리하기 위해 스레드 풀에서 스레드를 가져옵니다) ).
/// </summary>
/// <param name="ar"></param>
void EndSubmitKeywordsAsyncOperation(IAsyncResult ar)
{
_resultDataset =_submit.getResultDataset
(ar);
.
그 후 ASP.NET은 Page_PreRender 이벤트를 다시 호출하므로 이 이벤트에서 페이지의 테이블이 올바르게 채워질 수 있습니다.
이로써 나의 목적은 달성되었다. 또한 백그라운드에 제출한 후 재활성화 대기 시간이 초과되면
void 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