2009-03-17 2 views
0

생성하고 저장할 수있는 ASP.NET 페이지가 있습니다. 이 페이지는 이 실제로로드 시간이 오래 걸리므로 페이지를 요청한 사용자의 세션을 사용하면서 별도의 스레드에서 수행하고 싶습니다 (페이지를 볼 때처럼 보일 것입니다).).ASP에서 페이지를 생성하라는 요청을 스레드하고 싶습니다.

코드 숨김에서 새 스레드를 열면 요청 개체와 Server.Execute가 손상되므로 요청을 수행하는 동안 다른 페이지를 볼 수있는 다른 요청 방법이 필요합니다.

이렇게 할 방법이 있습니까?

감사합니다.

+0

왜 위키입니까? –

+0

가 동일한 것을 궁금해하고 있었다. –

+0

끌 수 있습니까? – Chris

답변

0

이 문제는 모든 페이지 우리가 세션 잠금 장치를 개최 요청 된 것이 었습니다.

http://blogs.msdn.com/amitsh/archive/2007/08/01/why-i-cannot-execute-two-requests-from-the-same-session-simultaneously-for-an-asp-net-application.aspx

이 예상되는 동작을 : 이것은 불가능 한 번에 두 개 이상의 페이지를 방문했다. 이 뒤에 그 이유 세션 상태 는 리더/라이터가 메커니즘 잠금 구현입니다 :

  • 있는 페이지 (또는 프레임) 세션 상태 쓰기 액세스 할 수 있습니다 (예 : <퍼센트의 @ 페이지 EnableSessionState = "진정한"% >)은 기본적으로 이며 요청이 완료 될 때까지 세션에서 쓰기 잠금을 유지합니다.

  • 세션 상태있는 페이지 (또는 프레임)에 대한 액세스를 판독 (예컨대 <% @ 페이지 EnableSessionState = "읽기 전용"%가>) 요청이 완료 될 때까지 세션 에만 리더 로크를 보유한다.

  • 잠금 개념에 따라 알 수 있듯이 Reader 잠금은 writer lock을 차단합니다. 독자 잠금 는 독자 잠금을 차단하지 않습니다. a 작성기 잠금은 모든 판독기 및 기록기를 차단합니다. 잠금.

이 잠금 이벤트 AcquireRequestState 내에 취득하고 요청 이벤트 ReleaseRequestState 발매. 즉, 하나 프레임/페이지는 다른 이 끝날 때까지 기다려야한다, (당신이 EnableSessionState = "읽기 전용"을 사용하지 않는 기본 옵션 )이 프레임/페이지 모두 세션 상태 쓰기 권한이 이유있는 경우입니다.

EnableSessionState를 ReadOnly로 설정하면 첫 페이지가 백그라운드에서 실행되는 것을 기다리는 동안 리디렉션 (따라서 다른 페이지 요청)을 할 수 있습니다.

1

요청 및 세션 데이터에 대한 외관을 사용하여 확실히 수행 할 수 있습니다. 그러나 Request 또는 Session을 직접 호출하는 대신 Facade를 사용하도록 페이지의 모든 코드를 변경해야합니다.

별도의 스레드를 시작할 때 Request 및 Session에 대해 필요한 모든 정보를 저장하고 데이터베이스 또는 HttpRuntime.Cache에 저장하는 새 (사용자 지정) SessionData 개체를 만듭니다. 해당 개체의 식별자를 스레드에 전달하면 스레드가 사용할 SessionData 개체를 알 수 있습니다.

특수 작업자 스레드 인 경우 ID로 SessionFacade를 인스턴스화 할 수 있습니다. 그렇지 않으면 매개 변수없이 인스턴스를 생성하십시오.

다음은 시작 잘하면 충분히 얻으려면 SessionFacade의 예 :

우리의 특별한 경우
class SessionFacade 
{ 
    private string _threadID; 

    public SessionFacade() { } 

    public SessionFacade(string threadID) 
    { 
     this._threadID = threadID; 
    } 

    public object this[string key] 
    { 
     get 
     { 
      return this.GetData(key); 
     } 
    } 

    protected object GetData(string key) 
    { 
     if(!string.IsNullOrEmpty(this._threadID)) 
     { 
      return ((SessionData)HttpRuntime.Cache[this._threadID])[key]; 
     } 
     else 
     { 
      return Session[key]; 
     } 
    } 
} 
관련 문제