Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Debug.Assert语句有时会失败?_C#_.net - Fatal编程技术网

C# 为什么Debug.Assert语句有时会失败?

C# 为什么Debug.Assert语句有时会失败?,c#,.net,C#,.net,我编写了下面的代码,但有时调试失败。 为什么Debug.Assert语句有时会失败,如何修复它 public class Warehouse { private int stockCount = 0; public void DecrementStock () { if ( stockCount > 0 ) stockCount--; Debug.Assert ( stockCount >= 0 ) } p

我编写了下面的代码,但有时调试失败。 为什么Debug.Assert语句有时会失败,如何修复它

public class Warehouse
{
   private int stockCount = 0;

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

      Debug.Assert ( stockCount >= 0 )
   }

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

调用
递减库存
时,表示
库存计数
-1
。if条件将导致跳过
stockCount--
,然后
stockCount
仍将是
-1
,并触发
Debug.Assert

如果这些被认为是唯一涉及库存计数的函数,那么

  • IncrementStock
    被多次调用,以至于值溢出

  • 从多个线程调用DecrementStock
    ,而不进行同步

根据您的评论,我认为多线程的不同步访问确实是问题所在。

这听起来像是多线程问题。我建议在访问
stockCount
成员的周围放置一个

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 ++;
        }
    }
 }

我使用此服务增加或减少计数,并通过外部服务呼叫。通常工作正常,但有时raise失败。
Debug
类方法仅在运行的程序集是在“Debug”模式下构建的情况下工作。当您没有在调试模式下运行时,代码是否“失败”?