if(true) return игнорируется

71
24 марта 2021, 03:30

Есть метод, который возвращает сложную переменную. Ее вычисление занимает не так мало времени, поэтому сделал что-то похожее на кэш.

public static Forge DeserializeForge(bool cleanCache = false) {
    if (CachedForge != null && !cleanCache)
        return CachedForge;
    _semaphoreSlim.Wait();
    ...Процесс получения переменной
    _semaphoreSlim.Release();
    return CachedForge;
}

Дебажил программу, и обнаружил, что у меня очень часто вызывается метод, задействованный в получении переменной. Дебаггер показал мне вот такую интересную проблему:

Дебаггер показывает, что условие в if верно, те у нас должен был исполниться return, и выйти из функции, однако он идет дальше. Почему?

Answer 1

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

Таким образом у нас вызывается метод в первый раз, условие ложно, идем обновлять переменную, блокируем семафор, вычисляем переменную, (пока она вычисляется она всё-еще null), в это время метод вызывается еще несколько раз, условие ложно, и все эти вызовы останавливаются ждать освобождения семафора. После переменная уже со значением, что и показывает дебаггер, но у нас скопились запросы, исполняющиеся по очереди из-за семафора.

READ ALSO
C# MVVM как взаимодействовать с элементами

C# MVVM как взаимодействовать с элементами

Есть у меня ViewModel класс который описывает логику взаимодействия, и в нём есть одно поле к которому биндится кнопка/TextBox, как мне повлиять на состояние...

80
Отключить хеширование пароля

Отключить хеширование пароля

В проекте используется стандартная аутентификация Individual User AccountsДобавил в модель новое поле password

96
Перемещение точек в 3D пространстве

Перемещение точек в 3D пространстве

Хочу попрактиковаться за это лето и попробовать написать что-нибудь в 3D с помощью библиотеки SystemWindows

103
Вернуть значение из таблицы

Вернуть значение из таблицы

Есть таблица(Table) с полями (Name, age) 1Нужно проверить существование записи в таблице по имени

116