C# 如果测试在不应该的时候通过
看起来我有一个JIT错误(另一个:/): 我有一段代码:C# 如果测试在不应该的时候通过,c#,64-bit,jit,C#,64 Bit,Jit,看起来我有一个JIT错误(另一个:/): 我有一段代码: private Boolean m_bIsLoaded = false; public Boolean IsLoaded { get { return this.m_bIsLoaded; } set { this.m_bIsLoaded = value; } } public long DocGedCourrier { get {
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平台(WindowsXPServicePack3)上运行windows服务,没有优化
当我远程连接调试器并在this.Load()方法上放置断点时,调试器停止。如果我查看this.IsLoaded的值,则返回True
如果在未连接调试器的情况下运行服务,则始终会调用Load()函数,即使IsLoaded==True
如果在连接了调试器的情况下运行服务,则在逐步调试时不会调用Load()
如果我在x86平台(WindowsXPServicePack3)上运行该服务,无论是否连接调试器,它都能完美工作
m_bisload无法更改,因为m_bisload仅使用IsLoaded属性设置,并且仅调用一次集{this.m_bisload=value;},且IsLoaded=true
我99.99%确定这是一个JIT错误,因为我已经遇到了这种问题(另请参阅)
我的问题是:
我怎样才能发现这种问题并避免它们呢
谢谢,
编辑:
我添加了一个锁以确保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;
}
}
}
这并没有解决问题。正如您在这个屏幕截图中所看到的:。Return即使IsLoaded设置为True,这也不是调用
我排除了多线程访问的可能性。顺便说一下,IsLoaded仅在初始化字段时设置为false。如果IsLoaded为True,那么我的代码中就不可能再有False值了
我能做些什么来防止这种情况发生?这可能是由某种比赛条件引起的。你的
的setter和DocGedCourrier
的getter是否在一个线程中运行。。IsLoaded初始设置为False,但查看调试器中另一个属性的值会导致IsLoaded传递为True
无论是什么原因,感谢您的帮助。尝试在IsLoaded属性的set部分设置断点。当调试器停止时,查看堆栈窗口以查找谁在调用属性。正如我所提到的,集合只被调用一次。我用断点检查了这个。指定的值为True。在此之后,即使IsLoaded,If pass也会返回True。您确定这不是可见性问题,即m_bisload字段是否仅由同一线程访问/修改?False从不分配给m_bisload或IsLoaded。唯一错误的赋值是在m_bisload的声明中。@Filimindji,请确保二进制文件是正确的(只是出于偏执-您将其作为服务运行,因此可能二进制文件是旧的)。将跟踪语句添加到构造函数和加载方法中,记录完整的调用堆栈,并确保将输出跟踪到文件中,这可能会显示一些有用的信息。