它看起來檢驗合格像我有一個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 Service Pack 3)中進行調試,無需優化。
當我遠程連接調試器並且在this.Load()方法上放置了一個斷點時,調試器停止。如果我看看這個.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值。
我能做些什麼來防止這種情況發生?
嘗試在IsLoaded屬性的設置部分中設置斷點。當調試器停止時,看看你的堆棧窗口,找到誰正在調用該屬性。 – Steve 2012-03-12 16:07:04
正如我所提到的,該集合只被調用一次。我用斷點檢查了這個。分配的值爲True。之後,If傳遞,即使IsLoaded返回True。 – Filimindji 2012-03-12 16:13:59
你確定它不是一個可見性問題,也就是說m_BIsLoaded字段只能被同一個線程訪問/修改嗎? – afrischke 2012-03-12 16:34:01