Можно (нужно?) Использовать Lazy в качестве метода кеширования?

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

class Foo
{
    Lazy<string> cachedAttribute;

    Foo()
    {
        invalidateCache();
    }

    string initCache()
    {
        string returnVal = "";
        //CALCULATE RETURNVAL HERE
        return returnVal;
    }

    public String CachedAttr
    {
        get
        {
            return cachedAttribute.Value;
        }
    }

    void invalidateCache()
    {
        cachedAttribute = new Lazy<string>(initCache, true);
    }
}

Мои вопросы:

  1. Будет ли это работать вообще?
  2. Как должна работать блокировка?

Мне кажется, что у меня отсутствует блокировка где-то рядом с invalidateCache , но хоть убей, я не могу понять, что это.

Я уверен, что где-то проблема, я просто не понял, где.

[EDIT]

Хорошо, похоже, я был прав, были вещи, о которых я не думал. Если поток увидит устаревший кеш, это будет очень плохо, поэтому похоже, что «Ленивый» недостаточно безопасен. Однако к Property часто обращаются, поэтому я занимался предварительной оптимизацией в надежде, что смогу чему-то научиться и иметь шаблон для использования в будущем для поточно-безопасного кэширования. Я продолжу работать над этим.

PS: Я решил сделать объект поточно небезопасным и вместо этого тщательно контролировать доступ к объекту.

9
задан Crisfole 3 December 2010 в 18:30
поделиться