2011-10-09 3 views
1

다른 스레드에서 함수를 실행하는 asp.net에 비동기 페이지를 쓰려고합니다. 다음 코드의 문제는 디버그 할 때 EndAsyncOperation 함수가 호출되지 않는다는 것입니다. 따라서 페이지가 완전히로드되지 않고 계속로드됩니다. Action을 사용하여 스레드 풀의 다른 스레드에서 코드를 실행합니다. 작동하는 다른 스레드에서 코드를 실행하는 다른 방법이 있습니까?Action.BeginInvoke ASP.Net Async 페이지

어디로 잘못 가고 있습니까?

그리고 또 다른 질문입니다. ASP .Net에서이 페이지는 스레드 풀로 실행됩니다. 그래서 내 사이트를 디버그하고 몇 페이지를 함께로드하려고 할 때마다 차례로로드됩니다.

public partial class AsyncPage : System.Web.UI.Page 
{ 
    void Page_Load(object sender, EventArgs e) 
    { 
     AddOnPreRenderCompleteAsync(
      new BeginEventHandler(BeginAsyncOperation), 
      new EndEventHandler(EndAsyncOperation) 
     ); 
    } 

    IAsyncResult BeginAsyncOperation(object sender, EventArgs e, 
     AsyncCallback cb, object state) 
    { 
     Action action =() => 
      { 
       Start(); 
      }; 

     IAsyncResult asyncResult = action.BeginInvoke(new AsyncCallback(action.EndInvoke), null); 

     return asyncResult; 
    } 

    void EndAsyncOperation(IAsyncResult ar) 
    { 
     // This function isn't reached 
    } 

    public void Start() 
    { 
     // Do something 
    } 
} 
+0

질문 당 하나의 질문 만하십시오. –

답변

1

나는 당신이 새로운 하나를 만들 수 없습니다 BeginInvoke에 BeginAsyncOperation 메서드 매개 변수에 제공 한 AsyncCallback 객체를 전달할 필요가 있다고 생각합니다.

세션 구성 때문에 페이지가 동 기적으로로드됩니다.

ASP.NET 세션 상태에 대한 액세스는 세션마다 독점적입니다. 즉, 두 명의 서로 다른 사용자가 동시 요청을하면 각 개별 세션에 대한 액세스가 동시에 부여됩니다. 그러나 동일한 세션 ID 값을 사용하여 동일한 세션에 대해 두 개의 동시 요청이 이루어지면 첫 번째 요청은 세션 정보에 독점적으로 액세스합니다. 두 번째 요청은 첫 번째 요청이 완료된 후에 만 ​​실행됩니다. (첫 번째 요청이 잠금 시간 초과를 초과하여 정보의 독점 잠금이 해제 된 경우 두 번째 세션도 액세스 할 수 있습니다.) @ Page 지시문의 EnableSessionState 값이 ReadOnly로 설정된 경우 읽기 전용 요청 세션 정보 만이 세션 데이터에 독점적 인 잠금을 초래하지 않습니다. 그러나 세션 데이터에 대한 읽기 전용 요청은 세션 데이터가 지워지도록 읽기 - 쓰기 요청에 의해 설정된 잠금을 기다려야 할 수도 있습니다.

출처 : ASP.NET Session State Overview, 내 하이라이트.