2013-05-16 9 views
4

내 page1.aspx에서 스레드를 사용하여 데이터베이스에서 보고서를 생성하고 있습니다.Asp.net 세션 변수를 스레드에 의해 업데이트가 반영되지 않습니다.

//on button click 
Hashtable ht = (Hashtable)Session["ReportParam"]; 
ReportThreadClass rth = new ReportThreadClass(ht); 
Thread thread = new System.Threading.ThreadStart(rth .Run); 
thread.Start(); 

내 스레드 클래스의 럼 메서드에서 Hashtable의 값을 업데이트하여 생성 한 페이지의 수를 지정합니다. 모든 일이 잘 작동 내가 세션에서 업데이트 된 값을 얻고에서 InProc 모드에서 내가 위의 코드를 실행하면 내 Page2.aspx에서

//in thread' method   
public virtual void Run() 
{  
    int pagecount=0; 
    while(done) 
    { 
     //loading data from DB and generating html pages 

     ht["Total_Pages"] = pagecount; 
    } 
} 

은 내가

Hashtable ht = (Hashtable)Session["ReportParam"]; 
int TotalPages = (int) ht["Total_Pages"]; 

변수 세션에서 값을 읽고 있습니다. 모든 것은 정적 변수에 저장되고 ht는 Session에 의해 참조되므로 세션에서 자동으로 업데이트됩니다 (세션에 다시 할당 할 필요가없는 HashTable).

그러나 State Server (OutProc 모드)에서 코드를 실행하면 해시 테이블을 serialize하여 세션 데이터를 다른 프로세스에 저장해야합니다.

그러나 Total_Pages의 값은 Thread가 완전히 실행 된 후에도 Page2.aspx에서 업데이트되지 않습니다.

그래서 세션 변수에 모든 업데이트를 State-Server에 저장하도록하는 이벤트 나 메소드가 있습니다. 그렇다면 pls가 말해줍니다. 그렇지 않다면 pls는 page2.aspx에서 업데이트 된 값을 얻기위한 아이디어를 제안합니다.

+0

어떻게 호출하고 있습니다 Page2.aspx – user1130157

+1

모든 페이지를 완전히로드 할 때까지 Jquery에서 계속 호출하고 있습니다. –

+0

OutProc 모드에서 실행하고 디버그하려고하면 Page2.aspx를 실행할 때 두 번째 Session_Start 이벤트가 있습니까? – Alexander

답변

0

Out Proc Mode In Session은 일정한 이벤트 후에 저장되므로 스레드가 세션 변수를 업데이트하는 경우 저장소에 저장되지 않습니다.

Inproc 모드를 사용하는 경우 Static Dictionary에 세션 저장소가 있으므로 스레드가이를 업데이트하면 어떤 페이지로든 업데이트 된 값을 가져옵니다.

그래서 u는이 상황

  1. 사용 INPROC 모드
  2. 세션 ID와 값으로 키 스레드 클래스의 사전을 유지하기위한 두 가지 솔루션을하면 해시 테이블, 그래서 page2.aspx가 원하는 경우 해시 테이블의 값을 읽으려면 세션 ID를 메서드에 전달하고 필요한 값을 반환합니다.
+1

그래,하지만 해결책이 아닙니다. 내가 아무 것도 찾지 못하면 @ user1130157에 의해 제안 된 두 번째 해결책을 찾아 보겠습니다. –

+0

OutProc 모드에서 나는 위의 일을 할 수 있다고 생각합니다. 그래서 마침내 당신의 두 번째 솔루션으로 갈 것입니다. –

+1

끈기있는 세션 설정없이 웹 팜 시나리오에있는 경우 옵션 2는 켜고 꺼질 수 있습니다 ... – rene

1

은 내가 explictely 설정과 같이 sessionState의를 얻는 것 :

당신의 page2.apsx에서

// no complex object like hastable, just a plain value... 
Session["pageCount"] = pageCount; 

스레드의 실행에서 : 보고서 스레드가 업데이트되지

var pageCount = (int) Session["pageCount"]??0; 

이유 out-of-proc sessionstate를 사용할 때 세션 값은 세션에 해시 테이블을 감지 할 방법이 없기 때문에 변경된 값을 가지므로 기본 저장소를 업데이트하지 않습니다. hastable의 직렬화 된 버전. 당신이 하나의 불변 객체를 명시 적으로 저장할 때 그것은 변경된 값을 유지할 것입니다;

스레드가 완료되면 세션이 이미 사라져 버릴 수도 있으므로 SqlSessionStateStore에 대한 참조를 확보하고 SetAndReleaseItemExclusive를 호출하십시오. 궁극적으로 시나리오를 처리 할 수있는 오버로드 된 SessionStateProvider가 필요할 수 있습니다.

+0

OutProc Mode에서는 세션 값이 Request_EndEvent 이후의 영구 저장 장치에 저장되므로이 이벤트 이후 세션에 간단한 변수를 넣어도 작동하지 않으므로 작동하지 않습니다. –

0

효율성이 떨어지지 만 아마도 Page2의 페이지 수에 대해 데이터베이스를 핑합니다.

페이지 1의 페이지 수에 대해 별도의 세션 값을 만들고 동시에 다른 모든 작업을 수행하십시오. (편집 : 두 번째 부분을 신경 쓰지 마라, 그것은 Rene가 아래에 제안했던 것이다).

+0

데이터를 Stat-server에 저장하려고합니다. End_request 이벤트 이후에 Stat-server에 저장된 모든 세션 데이터가이 이벤트 이후에 여전히 실행 중입니다. end_request 이벤트가 완료되어 내 값이 State-server에 저장되지 않은 경우 어떻게 Stat-server에 쿼리 할 수 ​​있습니까? –