Если тест пройден, когда он не должен - PullRequest
0 голосов
/ 12 марта 2012

Похоже, у меня ошибка JIT (еще одна: /):

У меня есть этот кусок кода:

    private Boolean m_bIsLoaded = false;

    public Boolean IsLoaded
    {
        get { return this.m_bIsLoaded; }
        set { this.m_bIsLoaded = value; }
    }

    public long DocGedCourrier {
        get {
            if ((this.IsLoaded == false)) {
                this.Load();
            }
            return this.GetInt64Value("ID_DOCGEDCOURRIER");
        }
        set {
            this.SetValue("ID_DOCGEDCOURRIER", value);
            NotifyPropertyChanged("DocGedCourrier");
        }
    }

Я запускаю службу Windows на платформе x64 (Windows XP с пакетом обновления 3) в режиме отладки без оптимизации.

Когда я подключил отладчик удаленно и установил точку останова на метод this.Load (), отладчик остановился. Если я посмотрю значение this.IsLoaded, он вернет True.

Если я запускаю службу без отладчика, функция Load () всегда вызывается, даже если IsLoaded == True.

Если я запускаю службу с подключенным отладчиком, Load () не вызывается при пошаговой отладке.

Если я запускаю службу на платформе x86 (Windows XP с пакетом обновления 3), она работает отлично, с отладчиком и без него.

Нет способа, которым m_bIsLoaded мог бы измениться, поскольку m_bIsLoaded устанавливается только со свойством IsLoaded и значением set {this.m_bIsLoaded =; } вызывается только один раз, с IsLoaded = true.

Я на 99,99% уверен, что это ошибка JIT, потому что у меня уже была такая проблема (см. Также Переменная не увеличивается в C # Release x64 ).

Мой вопрос:

Как я мог обнаружить подобные проблемы и избежать их определенно?

Спасибо,

Редактировать :

Я добавляю блокировку, чтобы гарантировать, что IsLoaded не изменен другим потоком:

    public readonly Object Lock = new Object();

    public virtual Object Load()
    {
        lock (Lock)
        {
            if ((IsLoaded))
            {
                return this;
            }
        }
               ...
    }

    public Boolean IsLoaded
    {
        get { return this.m_bIsLoaded; }
        set
        {
            lock (Lock)
            {
                this.m_bIsLoaded = value;
            }
        }
    }

Это не решило проблему. Как вы можете видеть на этом снимке экрана: http://img15.hostingpics.net/pics/125986Screenshoot.jpg. Возврат это не вызов, даже если для IsLoaded установлено значение True.

Я исключаю возможность многопоточного доступа. Кстати, IsLoaded имеет значение false только тогда, когда поле инициализируется. Если IsLoaded имеет значение True, в моем коде больше не может быть значения False.

Что я могу сделать, чтобы предотвратить это?

Ответы [ 2 ]

0 голосов
/ 14 марта 2012

Проклятый .. IsLoaded изначально был установлен в False, но просмотр значения другого свойства в отладчике заставил IsLoaded перейти в True.

В любом случае, спасибо за вашу помощь.

0 голосов
/ 12 марта 2012

Это может быть вызвано какими-то условиями гонки. Ваш установщик IsLoaded и получатель DocGedCourrier работают в одном потоке?

...