看起来我有一个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");
}
}
我在调试中在x64平台(Windows XP Service Pack 3)上运行Windows服务,没有优化。
当我远程连接调试器并在this.Load()方法上放置断点时,调试器停止。如果我查看this.IsLoaded的值,则返回True。
如果我在没有附加调试器的情况下运行服务,即使IsLoaded == True,也始终会调用Load()函数。
如果我在附加调试器的情况下运行服务,则在逐步调试时不会调用Load()。
如果我在x86平台(Windows XP Service Pack 3)上运行该服务,它可以完美地工作,无论是否附带调试器。
m_bIsLoaded无法更改,因为m_bIsLoaded仅使用IsLoaded属性和set {this.m_bIsLoaded = value;只调用一次,IsLoaded = true。
我99.99%肯定这是一个JIT错误,因为我已经遇到过这种问题(另见Variable is not incrementing in 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值。
我该怎么做才能防止这种情况发生?
答案 0 :(得分:0)
这可能是由于某种竞争条件造成的。您的IsLoaded
和DocGedCourrier
的getter是否在一个线程中运行?
答案 1 :(得分:0)
Damned .. IsLoaded最初设置为False,但查看调试器中另一个属性的值导致IsLoaded传递给True。
无论是什么原因,谢谢你的帮助。