2012-01-25 39 views
2

我有一个堆栈溢出错误,我相当确信我没有任何种类的无限递归(至少我已经盯着错误现在几个小时,我无法想象如何无限循环)。堆栈溢出异常没有无限循环(据我所知)

下面是代码:

public decimal? Amount 
    { 
     get 
     { 
      if (!string.IsNullOrEmpty(_savedWork.Amount)) 
       return decimal.Parse(_savedWork.Amount); 
      else 
       return null; 
     } 
     set 
     { 
      if (value.HasValue) 
      { 
       _savedWork.Amount = value.Value.ToString(); 
       Percent = null; 
      } 
      else 
       _savedWork.Amount = ""; 
      OnPropertyChanged("Amount"); 
     } 
    } 

#Note我有一栋为空的十进制字符串,这就是为什么我转换了。请不要让我陷入为什么我要这样做。

savedWork.Amount = value.Value.ToString()是我得到的错误。

基本上我在想我的堆栈太小(或者我的代码太大了,我想)。 我基本上运行这个代码两次,它在一种形式时工作,但不是当我制作另一种形式并将它放在那里时,所以我认为这两种形式之间的区别在于小费。

有没有一种方法来确定我做错了什么?我想知道哪部分代码占用太多或者持续时间过长等。

我已经做了一些关于堆栈/堆的工作原理和我对PerfMon.exe的了解,但作为据我所知,它只适用于堆。是否有类似的工具可以用于我的程序正在运行的堆栈?

我发现this post约2个工具叫的WinDbgCDB但我不能找到太多有关如何安装/使用它们。这些工具是否正确?

或者,如果有一个无限循环或什么是好的。

编辑

这里是请求金额属性的代码(由它的EntityFramework自动生成),正如我所说的意见,步入甚至没有到达这里。我真的认为我的堆栈限制已经达到。

public global::System.String Amount 
    { 
     get 
     { 
      return _Amount; 
     } 
     set 
     { 
      OnAmountChanging(value); 
      ReportPropertyChanging("Amount"); 
      _Amount = StructuralObject.SetValidValue(value, true); 
      ReportPropertyChanged("Amount"); 
      OnAmountChanged(); 
     } 
    } 

最后编辑

好了,所以元骑士的回答给我看,我的确有一个无限循环。我有一个事件处理程序订阅DisplayTypeOfInvestment(金额属性所属的类)的PropertyChanged事件。该处理程序是这样的:

void DisplayTypeOfInvestmentList_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 
      _typeOfInvestmentFormSavedWork.TypeOfInvestment.Clear(); 
      foreach (DisplayInvestmentFund d in _displayInvestmentFundList) 
      { 
       _typeOfInvestmentFormSavedWork.TypeOfInvestment.Add(d.SavedWork); 
      } 

      OnPropertyChanged("TypeOfInvestmentFormSavedWork"); 

    } 

TypeOfInvestmentFormSavedWork是一个完全不同的类,它包含了它,它自己版本的SavedWork类,我们可以看到,使用了金额属性。此方法的要点是在Amount属性更改时将此TypeOfInvestmentFormSavedWork属性更新为_savedWork的新值。出于某种原因,这会触发DisplayTypeOfInvestment视图模型的PropertyChanged。我没有搞清楚,但我改变看起来像这样的方法:

void DisplayTypeOfInvestmentList_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "Amount" || e.PropertyName == "Percent") 
     { 
      _savedWork.TypeOfInvestment.Clear(); 
      foreach (DisplayInvestmentFund d in _displayInvestmentFundList) 
      { 
       _savedWork.TypeOfInvestment.Add(d.SavedWork); 
      } 

      OnPropertyChanged("CurrentWork"); 
     } 
    } 

if语句停止怪异特性在DisplayInvestmentFund被更改时添加方法被调用。

我意识到这个答案没有多大意义,但对于我来说详细解释这将需要很长的时间非常。我也意识到这可能意味着我的代码很糟糕。我不知道该怎么做。谢谢你们的帮助。

+3

你是否已经通过代码确认没有无限递归? – jrummell

+2

什么是您的OnPropertyChanged(“金额”);? –

+1

什么是'_savedWork'?它是这个类的一个实例,还是包含这个类的成员?闻起来像我无限的递归。 –

回答

1

必须以某种方式递归调用Amount设置器。你可以通过“加入”属性而不是逐步调试来调试它。如果将VS设置为不进入属性,则仍然可以在设置器中放置断点来模拟“步入”。至于VS不进入.edmx文件,正如CodeInChaos提到的那样,也许该类标记为DebuggerStepThrough属性。

+0

我修改了我的问题来解释为什么这是答案 –

6

我的猜测是你在OnPropertyChanged调用的事件处理函数之一中指定Amount

另一种可能性是,您在代码为SavedWork.Amount的设置程序中再次调用YourClass.Amount


但是,为什么不只是调试呢?只需通过Visual Studio调试器中的代码。

堆栈跟踪也应该有用。随着无尽的递归,你通常会得到重复的方法序列。如果我的猜测是正确的,重复的部分将如下所示:

MyClass.set_Amount 
MyClass.OnPropertyChanged 
OtherClass.myClass_amount_changed 
+0

是的,您不需要windbg或PerfMon或任何其他特殊工具,只需使用VS调试器!通过堆栈跟踪,断点和逐步调试,您可以确定发生了什么。 –

+0

我无法穿过它。当我跨过我分配的线路时,它就会中断。另外SavedWork是一个EntityObject,所以它并没有真正的PropertyChanged。我会发布什么subsribes的PropertyChanged,但它并没有真正得到那么多。 –

+1

@ExitMusic最可能的错误候选者是'savedWork.set_Amount'内的代码。所以请张贴该代码。 – CodesInChaos

2

是与_savedWork相同类型的哪个Amount成员的类?

因为可能有这样的循环:

1)您分配一个值金额

2)该值设置之前,您分配一个值_savedWork.Amount

3)前_savedWork.Amount的值时,该行再次触发

4)_savedWork._savedWork.Amount的值设置之前...

5)在_savedWork._savedWork._savedWork.Amount的值被设置之前...

而且这会变得无穷无尽。

+0

'_savedWord!= this'。 '_savedWork.Amount'是一个字符串,'value.Amount''十进制?' – CodesInChaos

+0

CodeInChaos正确 –

+1

这两个属性是不同的,但如果它们在代码中设置另一个,那么你仍然有无限递归,它只是切换永远在两个制定者之间,而不是停留在一个制定者之内。 – Servy

0

_savedWork与列出的Amount属性属于同一类型的对象吗?因为给你一个堆栈溢出错误!在这种情况下,您需要找到一种方法来谈论Amount而不用调用get ter和set ter。

+0

'_savedWord!= this'。 '_savedWork.Amount'是一个字符串,'value.Amount'是一个'Decimal?' – CodesInChaos