2016-05-04 6 views
0

Проблема в том, что мне нужно получить данные с SQL-сервера, используя хранимую процедуру, которая обычно занимает больше 10 секунд. Я пытался передать эту задачу потоку. В потоке, когда он получает данные, таблица хранится в переменной сеанса, которая будет использоваться на последующих страницах.Можно ли создать переменную сеанса в потоке?

Thread thread = new Thread(delegate() {Session["dashboardPatientrecords"]=df.getPatients(); }); 
thread.Start(); 

нить работает нормально вытягивать данные, но, как перейти на следующую страницу и попытайтесь получить доступ к переменной сессии, как

var dt=(DataTable)Session["dashboardPatientrecords"]; 

в «DT» установлен нулевой

пожалуйста, помогите

спасибо

+0

Назначить Session ["dashboardPatientrecords"] некоторое значение при загрузке первой страницы, чтобы вы могли определить, не изменилась ли переменная сеанса в потоке, который вы выполнили? Попробуйте написать некоторый журнал после добавления результата в сеанс. Кроме того, убедитесь, что вы не помещаете большие данные в сеанс для сохранения памяти. – Adil

+2

Вы не должны, в общем, разделять задачи на другие потоки в asp.net. Кроме того, помните, что бы вы ни делали за кулисами, asp.net по-прежнему HTTP - один запрос генерирует один ответ - поэтому, если что-то занимает десять секунд, вам все равно нужно подождать эти десять секунд, прежде чем вы сможете завершить свой ответ. Кроме того, я не совсем понимаю, какова ваша фактическая проблема. –

+0

@Damien_The_Unbeliever удален – niksofteng

ответ

1

Вы можете заполнить объект сеанса потоком. Не внутри нитки.

DataTable dt = null; 

var thread = new Thread(() => 
    { 
     dt = df.getPatients(); 
    }); 

thread.Start(); 
thread.Join(); 

Session["dashboardPatientrecords"] = dt; 
+0

Благодарим за быстрый ответ, этот блок кода работает нормально, но он заставляет меня ждать тех 10 секунд на странице, где объявлен поток. –

0

попробуйте это ..

DataTable dt=Session["dashboardPatientrecords"] as DataTable; 
+2

Проблема не в кастинге. Речь идет о заполнении объекта сеанса. Если бы это была проблема с литьем, тогда у ОП было бы исключение вместо «null» из-за синтаксиса '(type) null'. – niksofteng

1

Используйте Cache вместо Session. Нельзя использовать сеанс в потоковой среде.

+0

как мне его достичь, используя кеш? –

+0

То же, что и Session, но в этом случае используйте объект Cache. Например. Кэш ["dashboardPatientrecords"] = dt; Читайте о кэшировании здесь https://msdn.microsoft.com/en-us/library/system.web.caching.cache(v=vs.110).aspx – Sam

Смежные вопросы