2013-05-16 7 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, сколько страниц я создал.

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

     ht["Total_Pages"] = pagecount; 
    } 
} 

В моем Page2.aspx я читаю значения из сессии Variable

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

Когда я запускаю выше код в режиме InProc каждая вещь работает отлично, я получаю обновленные значения из сессии. Поскольку каждая вещь хранится в статической переменной, а ht ссылается на Session, поэтому она автоматически обновляется в сеансе (HashTable не требуется переназначать ее на сеанс).

Но когда я запускаю код в государственном сервере (режим OutProc), он должен хранить данные сеанса в разных процессах, сериализуя Hash-таблицу.

Но значение Total_Pages не обновляется в Page2.aspx даже после полного запуска Thread.

Итак, есть ли какое-либо событие или метод, которые будут уволены, чтобы хранить все обновления в переменной сеанса в State-Server, если да, тогда скажите мне. если нет, тогда PLS предложит мне некоторую идею получить обновленное значение в page2.aspx.

+0

Как вы вызываете свой Page2.aspx – user1130157

+1

Я постоянно вызываю его из JQuery, пока он полностью не загрузит все страницы. –

+0

Когда вы запускаете режим OutProc и пытаетесь отладить, есть ли второе событие Session_Start при запуске Page2.aspx? – Alexander

ответ

0

В режиме Out Proc сеанс сохраняется после некоторого события, поэтому, если ваш поток обновляет ваши переменные сеанса, он не будет сохраняться в памяти.

Если вы используете Inproc Mode, тогда хранилище сеансов в статическом словаре, поэтому, если ваш поток обновит его, u получит обновленное значение на любую страницу.

Так и есть два решения для этой ситуации режим

  1. Использование InProc
  2. Ведение словаря в классе резьбы с ключом, как Session ID и значение ваш хэш-таблицы, поэтому если page2.aspx хочет для чтения значения хэш-таблицы, тогда он передаст свой идентификатор сеанса методу и который вернет требуемое значение.
+1

Yup, но это не решение. если я ничего не найду, я пойду на второе решение, предложенное @ user1130157. –

+0

Я думаю, что в режиме OutProc я могу делать что-то выше, поэтому, наконец, я собираюсь с вашим вторым решением. –

+1

помните, что опция 2 может работать и выключаться, если вы находитесь в сценарии webfarm без установки липкой сессии ... – rene

1

Я explictely SET и GET SessionState так:

В вашей нити Run

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

В вашем page2.apsx:

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

Причина отчет нить не обновляется это значение сеанса при использовании out-of-proc sessionstate связано с тем, что сеанс не имеет способа определить, что хэш-таблица имеет измененное значение, поэтому оно не обновляет базовое хранилище с помощью сериализованная версия hastable. Когда вы обнаруживаете какой-либо неизменяемый объект, он будет сохраняться, когда изменится его значение;

Поскольку сессия, возможно, уже исчезла, когда ваш поток завершит настройку begtter, нужно получить ссылку на SqlSessionStateStore и вызвать SetAndReleaseItemExclusive. В конечном итоге вам может понадобиться перегруженный SessionStateProvider, который может обрабатывать ваш сценарий.

+0

Это не сработает, потому что в OutProc Mode значения сеанса хранятся в постоянном хранилище после Request_EndEvent, поэтому даже я ставлю простую переменную в сеансе после этого события, она не будет работать. –

0

Менее эффективно, но я, вероятно, просто проверил бы базу данных для подсчета страниц на странице Page2.

Или создайте отдельное значение сеанса для подсчета страниц на странице 1, в то же время, как и все остальное. (EDIT: Nevermind вторая часть, вот что предложил Рене ниже).

+0

Я храню данные в Stat-сервере. Все данные сеанса, сохраненные в Stat-сервере после события End_request, но мой поток по-прежнему работает после этого события. Итак, как я могу запросить Stat-сервер, если мое значение не хранится в State-server, потому что событие end_request выполнено. –