2015-09-21 2 views
0

У меня есть веб-приложение, которое, похоже, страдает от сеансов, заблокированных для (кажущихся) случайных запросов. Я знаю ограничения сеансов, что они заблокированы, чтобы сделать их потокобезопасными, поэтому одновременные сеансы недоступны для поставщика сеанса .NET.Проблемы SessionLock в ThreadPool

Однако мой вопрос относится к созданию потоков внутри TreadPool. В моем веб-приложении много фоновых задач, которые иногда вызываются косвенным образом по запросам пользователей.

Я недавно заметил, что создание потоков в ThreadPool сохраняет доступ к сеансу пользователей; который, как я подозреваю, вызывает случайную блокировку сеанса на сайте (то есть пользователь не может делать дальнейшие последующие запросы до тех пор, пока начальный запрос не завершит и не освободит сеанс). Я доказал, что доступ к сеансу возможен, выполнив следующее на образцовой странице и сделав несколько запросов, чтобы увидеть результаты переменных сеанса, которые были изменены через поток, который он делает.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Session["Cow"] == null) 
    Session["Cow"] = "Moo"; 
    ThreadPool.QueueUserWorkItem(x => { threadedMethod(); }); 
    Response.Write((string)Session["Cow"]); 
} 

private void threadedMethod() 
{ 
    // Detect if this has access to session 
    Session["Cow"] = "Grass! " + new Random().Next(100); 
} 

Когда я создаю потоки, я ранее предполагал, что данные сеанса недоступны для доступа; Теперь я понимаю, что это автоматически загружается, если доступно, и вызывает проблемы с блокировкой сеанса.

Кто-нибудь знает, как предотвратить передачу потока от сеанса и других связанных с клиентом деталей; с целью предотвратить любые проблемы с блокировкой сеанса, которые он может вызвать?

+0

Это поведение по дизайну делает его безопасным, если вы пишете что-либо в сеансе, другим приходится ждать, пока запрос не будет обработан. Что касается производительности, вы можете использовать сеанс readonly или отключить сеанс, но это не подходит для вас, поскольку вам нужно писать в сеансе. Вы можете попробовать настроить поставщика данных сеанса. –

+0

Взгляните на http://www.timvasil.com/blog14/post/2008/04/16/Handling-multiple-simultaneous-requests-from-a-user-in-ASPNET.aspx –

+0

Я думаю, что вы ошибаетесь -understood. Созданный поток имеет доступ к сеансу; однако я хочу, чтобы threadedMethod выполнял связанные с сервером задачи, которые занимают много времени и не нуждаются в доступе к данным, связанным с сеансом. Как отключить это, сохраняя при этом доступ на запись к исходному запросу пользователя? – Radderz

ответ

1

Сессия заблокирована дизайном, как указано в комментариях. Но в вашем примере сеанс берется из экземпляра класса страницы. Таким образом, метод threadedMethod статический, и вы не будете подключены к сеансу. Если вам нужны данные из сеанса в рабочем потоке - передайте его как параметры.

+0

Ваше право, если я сделаю метод статическим, я больше не могу получить доступ к сеансу. Если он не является статическим, поток может получить к нему доступ. Я только что проверил и мои потоковые методы в моем проекте, и они на самом деле определены как статические, поэтому я предполагаю, что это говорит о том, что что-то еще блокирует сеанс? : | – Radderz

+0

Я нашел пару записей в глобальном, которые не ссылаются на статический метод, тем самым блокируя сеанс. Огромное спасибо! – Radderz