如果测试通过则不应该

时间:2012-03-12 16:01:59

标签: 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 {
            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值。

我该怎么做才能防止这种情况发生?

2 个答案:

答案 0 :(得分:0)

这可能是由于某种竞争条件造成的。您的IsLoadedDocGedCourrier的getter是否在一个线程中运行?

答案 1 :(得分:0)

Damned .. IsLoaded最初设置为False,但查看调试器中另一个属性的值导致IsLoaded传递给True。

无论是什么原因,谢谢你的帮助。