Есть метод, который возвращает сложную переменную. Ее вычисление занимает не так мало времени, поэтому сделал что-то похожее на кэш.
public static Forge DeserializeForge(bool cleanCache = false) {
if (CachedForge != null && !cleanCache)
return CachedForge;
_semaphoreSlim.Wait();
...Процесс получения переменной
_semaphoreSlim.Release();
return CachedForge;
}
Дебажил программу, и обнаружил, что у меня очень часто вызывается метод, задействованный в получении переменной. Дебаггер показал мне вот такую интересную проблему:
Дебаггер показывает, что условие в if
верно, те у нас должен был исполниться return, и выйти из функции, однако он идет дальше. Почему?
Я понял из-за чего это происходило. Видимо метод вызывался слишком быстро, а вычисление значения происходило дольше, чем происходили новые запросы к методу.
Таким образом у нас вызывается метод в первый раз, условие ложно, идем обновлять переменную, блокируем семафор, вычисляем переменную, (пока она вычисляется она всё-еще null), в это время метод вызывается еще несколько раз, условие ложно, и все эти вызовы останавливаются ждать освобождения семафора. После переменная уже со значением, что и показывает дебаггер, но у нас скопились запросы, исполняющиеся по очереди из-за семафора.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Есть у меня ViewModel класс который описывает логику взаимодействия, и в нём есть одно поле к которому биндится кнопка/TextBox, как мне повлиять на состояние...
В проекте используется стандартная аутентификация Individual User AccountsДобавил в модель новое поле password
Хочу попрактиковаться за это лето и попробовать написать что-нибудь в 3D с помощью библиотеки SystemWindows
Есть таблица(Table) с полями (Name, age) 1Нужно проверить существование записи в таблице по имени