Я поддерживаю приложение, которое использует общую библиотеку, которая имеет статический экземпляр класса (ClassWrapper).Этот класс является в основном оболочкой для CacheManager шаблонов и практик Microsoft (v3.1 EL)
Библиотека размещается в веб-приложении, а также в приложении службы Windows (оба по своей сути являются многопоточными).) Существует множество мест в приложении, которое вызывает метод Add для этой оболочки, который, в свою очередь, вызывает Add для менеджера кэша, чтобы добавить элемент в менеджер кэша.
Как я понимаю, CacheManager не является поточно-ориентированным, и CacheWrapper не выполняет никакой блокировки для обеспечения безопасности потока при вызове Add.
Я не могу изменить код библиотеки напрямую, чтобы добавить синхронизациюи я собираюсь написать вспомогательный метод, подобный этому, и изменить все сайты вызовов для использования этого помощника вместо прямого вызова Add для оболочки.
class CacheHelper
{
private static object _syncLock = new object();
public static void Add<T>(CacheWrapper wrapper, string key, T value, int expireInMins)
{
lock (_syncLock)
{
wrapper.Add(key, value, expireInMins);
}
}
}
Вы видите какие-либо проблемы с этим подходом.Я немного утомлен, поскольку CacheWrapper статичен и, следовательно, по своей сути так же является _syncLock.Я чувствую себя немного неловко, блокируя статические объекты, но у меня нет большого выбора, поскольку CacheWrapper - это статический экземпляр, отображаемый во всем пространстве процессов хоста (веб-приложение и служба Windows).
Любой совет или вотум доверия будут высоко оценены.