2012-03-12 74 views
0

它看起來檢驗合格像我有一個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值。

我能做些什麼來防止這種情況發生?

+1

嘗試在IsLoaded屬性的設置部分中設置斷點。當調試器停止時,看看你的堆棧窗口,找到誰正在調用該屬性。 – Steve 2012-03-12 16:07:04

+0

正如我所提到的,該集合只被調用一次。我用斷點檢查了這個。分配的值爲True。之後,If傳遞,即使IsLoaded返回True。 – Filimindji 2012-03-12 16:13:59

+0

你確定它不是一個可見性問題,也就是說m_BIsLoaded字段只能被同一個線程訪問/修改嗎? – afrischke 2012-03-12 16:34:01

回答

0

Damned .. IsLoaded初始化設置爲False,但查看調試器中另一個屬性的值導致IsLoaded傳遞給True。

無論什麼原因,謝謝你的幫助。

0

這可能是由某種競爭條件引起的。您是否在一個線程中運行了IsLoaded和獲取者DocGedCourrier

+0

我剛加了一個鎖。主要問題的更多信息。 – Filimindji 2012-03-12 16:59:02