Есть метод, который возвращает сложную переменную. Ее вычисление занимает не так мало времени, поэтому сделал что-то похожее на кэш.
public static Forge DeserializeForge(bool cleanCache = false) {
if (CachedForge != null && !cleanCache)
return CachedForge;
_semaphoreSlim.Wait();
...Процесс получения переменной
_semaphoreSlim.Release();
return CachedForge;
}
Дебажил программу, и обнаружил, что у меня очень часто вызывается метод, задействованный в получении переменной. Дебаггер показал мне вот такую интересную проблему:
Дебаггер показывает, что условие в if верно, те у нас должен был исполниться return, и выйти из функции, однако он идет дальше. Почему?
Я понял из-за чего это происходило. Видимо метод вызывался слишком быстро, а вычисление значения происходило дольше, чем происходили новые запросы к методу.
Таким образом у нас вызывается метод в первый раз, условие ложно, идем обновлять переменную, блокируем семафор, вычисляем переменную, (пока она вычисляется она всё-еще null), в это время метод вызывается еще несколько раз, условие ложно, и все эти вызовы останавливаются ждать освобождения семафора. После переменная уже со значением, что и показывает дебаггер, но у нас скопились запросы, исполняющиеся по очереди из-за семафора.
Продвижение своими сайтами как стратегия роста и независимости