Похоже, у меня ошибка 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.
Что я могу сделать, чтобы предотвратить это?