Как мне сохранить объект между потоками без использования httpcontext.items?

StackOverflow https://stackoverflow.com/questions/728065

Вопрос

У меня есть объект, который обрабатывает кэширование памяти для моего уровня доступа к данным (DAL), и мне нужно сохранить его между потоками. Из того, что я прочитал, предпочтительный метод - это использовать httpcontext.item с кодом, как SO:

   Shared Property DALList() As Dictionary(Of String, DAL)
        Get
            If Not Web.HttpContext.Current.Items.Contains("_DALList") Then
                Web.HttpContext.Current.Items.Add("_DALList", New Dictionary(Of String, DAL))
            End If
            Return Web.HttpContext.Current.Items("_DALList")
        End Get
        Set(ByVal value As Dictionary(Of String, DAL))
            If Not Web.HttpContext.Current.Items.Contains("_DALList") Then
                Web.HttpContext.Current.Items.Add("_DALList", value)
            Else
                Web.HttpContext.Current.Items("_DALList") = value
            End If
        End Set
    End Property

Два вопроса: это пытается сериализовать объект, и если да, то как мне заставить его оставить объект нетронутым и просто ссылаться на его в памяти вместо того, чтобы сериализовать его? Мне нужно, чтобы объект не поврежден, поскольку он обрабатывает соединения БД и кэширование под крышками.

РЕДАКТИРОВАТЬ

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

Ошибка приложения w3wp.exe, версия 7.0.6001.18000, временная марка 0x47919ed8, kernel32.dll, версия 6.0.6001.18000, временная марка 0x4791ada5, Code 0xe053534f, Offset 0x0000000026499d, Process Id ID. Анкет

а также

Сервер штата закрыл срок действия TCP/IP -соединения. IP -адрес клиента составляет 127.0.0.1. Срок действия операции чтения началась в 04.07.2009 20:44:29.

Затем я перефразировал код, чтобы поместить элементы в словарный объект против идентификатора сеанса, и я получаю эти ошибки SMAE. Если я использую статические переменные, это работает нормально, но тогда у меня возникнут моя первоначальная проблема, которая заключается в том, что пользователи будут получать доступ к данным другим пользователям (очевидно, это не вариант).

Перефразированная версия выглядит следующим образом: (это работает для первого метода, но не для этого)

Shared _CurrentScope As New Dictionary(Of String, DALScope)
Public Shared Property CurrentScope() As DALScope
    Get
        If Not _CurrentScope.ContainsKey(Web.HttpContext.Current.Session.SessionID & "_CurrentScope") Then
            _CurrentScope.Add(Web.HttpContext.Current.Session.SessionID & "_CurrentScope", New DALScope)
        End If
        Return _CurrentScope(Web.HttpContext.Current.Session.SessionID & "_CurrentScope")
    End Get
    Set(ByVal value As DALScope)
        If Not _CurrentScope.ContainsKey(Web.HttpContext.Current.Session.SessionID & "_Currentscope") Then
            _CurrentScope.Add(Web.HttpContext.Current.Session.SessionID & "_Currentscope", value)
        Else
            _CurrentScope(Web.HttpContext.Current.Session.SessionID & "_Currentscope") = value
        End If
    End Set
End Property

РЕДАКТИРОВАТЬ

Хорошая точка зрения на блокировку в случае, когда их более чем один WebRequest в соответствии с тем же сеансом. Я закончил тем, что использовал подход httpcontext.item и обнаружил, что у меня проблемы были связаны с тем, что свойство является байвалем вместо Byref. Я изменил свой код, чтобы включить методы, которые занимаются объектами, и теперь это работает.

Это было полезно?

Решение

Httpcontext существует в течение жизни одного запроса. Я предполагаю, что по тему здесь вы говорите о поддержании состояния, приобретая несколько запросов. Если это так, то httpcontext.items не то, что вы хотите. Вы хотели бы использовать кеш приложения или какой -то другой механизм кэширования.

В качестве примечания поместите элемент в httpcontext.items не сериализует его. Если вы идете с сериализацией кэша, зависит от того, есть ли у вас хранитель поддержки для кеша, но, поскольку это специфично к кешу, это действительно зависит от выбранного вами кэша.

Редактировать

Насколько я понимаю, он возвращает ссылку на тот же экземпляр, который вы вкладываете в систему. Я использую httpcontext для хранения моих сеансов Nhibernate, в которых довольно много вещей. Работает потрясающе.

Другие советы

Как уже упоминал Джош, если вы хотите кэшировать во время одного запроса, то httpcontext.items - это путь. Если это не работает, то вы должны делать что -то не так, где именно вы добавляете данные в httpcontext.items? Я обычно использую httpmodule и добавляю данные в обработчике begin_request, но все зависит от того, что вы пытаетесь сделать

Я мог бы ошибаться, но я не вижу никакой блокировки, вы можете ожидать все виды проблем, если/когда многие потоки попытаются создавать/использовать/изменить объект.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top