2011-07-04 34 views
0

我寫下面的代碼,但有時Debug.Assert引發失敗。 爲什麼Debug.Assert語句有時會失敗,我該如何解決它?爲什麼Debug.Assert語句有時會失敗?

public class Warehouse 
{ 
    private int stockCount = 0; 

    public void DecrementStock() 
    { 
     if (stockCount > 0) 
     stockCount--; 

     Debug.Assert (stockCount >= 0) 
    } 

    public void IncrementStock() 
    { 
     stockCount ++; 
    } 
} 
+0

有時......?什麼時候? – BoltClock

+0

我使用此服務來增加或減少計數,並通過外部服務呼叫。通常工作正常,但有時會失敗。 – Peyman

+0

只有當正在運行的程序集以「調試」模式構建時,'Debug'類方法纔有效。當您沒有在調試模式下運行時,您的代碼是否「失敗」? –

回答

4

這聽起來像是一個多線程問題。我建議圍繞訪問stockCount成員放置一個lock

public class Warehouse 
{ 
    private int stockCount = 0; 
    private object stockSynch = new object(); 

    public void DecrementStock() 
    { 
     lock(stockSynch) 
     { 
      if (stockCount > 0) 
      stockCount--; 

      Debug.Assert (stockCount >= 0) 
     } 
    } 

    public void IncrementStock() 
    { 
     lock(stockSynch) 
     { 
      stockCount ++; 
     } 
    } 
} 
4

stockCount-1DecrementStock被調用。如果條件將導致stockCount--被跳過,則stockCount仍然是-1並且觸發Debug.Assert

如果這些都應該是觸摸stockCount唯一功能,然後要麼

  • IncrementStock被調用許多次,該值溢出

  • DecrementStock是從多線程調用而不同步

根據您的評論,我認爲來自多個線程的非同步訪問的確是問題。

+0

+1我懷疑多線程無瓦同步 – BrokenGlass

相關問題