C# 如果测试在不应该的时候通过

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 {

看起来我有一个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平台(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,请确保二进制文件是正确的(只是出于偏执-您将其作为服务运行,因此可能二进制文件是旧的)。将跟踪语句添加到构造函数和加载方法中,记录完整的调用堆栈,并确保将输出跟踪到文件中,这可能会显示一些有用的信息。