Кэш обнуляется, когда я пытаюсь получить информацию в другом методе класса - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь использовать кеш, чтобы сохранить некоторую информацию для последующего использования.Вот как я назначаю кеш:

foreach(MibGet Device in DeviceValuesList)
{
    if (HttpContext.Current.Cache[DeviceID] == null)
    {
        HttpContext.Current.Cache[DeviceID] = DeviceValue;
    }
}

Я вижу в отладчике, что этот код работает абсолютно нормально, все данные, которые мне нужны, назначены правильно.Но когда я пытаюсь извлечь эту информацию из кеша следующим образом (из другого метода класса):

if (NewValue != HttpContext.Current.Cache[DeviceID].ToString())
{
    HttpContext.Current.Cache[DeviceID] = NewValue;
}

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

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

HttpContext.Current - ноль, когда нет тока HttpContext.ASP.NET использует один поток на модель запроса.Он создает экземпляр HttpContext и связывает его с потоком, который обрабатывает запрос.Но если вы создаете поток, явно неявно с помощью задач или асинхронного программирования, он может не быть связан с HttpContext

. Я предлагаю вам использовать некоторые другие классы кэша, такие как System.Runtime.Caching.MemoryCache, которые не связаныдо HttpContext.

0 голосов
/ 11 декабря 2018

Я предполагаю, что ваш кеш - это словарь.Тогда вместо

if (get.Value != HttpContext.Current.Cache[get.DeviceID.ToString()].ToString())

вы должны написать

if (!HttpContext.Current.Cache.ContainsKey(get.DeviceID))

Также в свой первый фрагмент кода вы помещаете Device.Value в кеш, но во второй фрагмент вставляете DeviceID.Я не вижу, как это сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...