我有一个堆栈溢出错误,我很确定我没有任何类型的无限递归(至少我已经盯着这个错误看了几个小时了,我无法想象它是如何循环的无限)。
代码如下:
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 个名为 windbg 和 cdb 的工具,但我找不到太多关于如何安装/使用它们的信息。这些工具是正确的方法吗?
或者,如果有一个无限循环或其他会很棒的东西。
编辑
正如我在评论中所说,这是为 Amount 属性请求的代码(它由 EntityFramework 自动生成),进入的步骤甚至没有到达这里。我确实认为我的堆栈限制刚刚达到。
public global::System.String Amount
{
get
{
return _Amount;
}
set
{
OnAmountChanging(value);
ReportPropertyChanging("Amount");
_Amount = StructuralObject.SetValidValue(value, true);
ReportPropertyChanged("Amount");
OnAmountChanged();
}
}
最终编辑
好吧,Meta-Knight 的回答告诉我,我确实有一个无限循环。我有一个事件处理程序订阅了 DisplayTypeOfInvestment(Amount 属性所属的类)的 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 属性。此方法的目的是在 Amount 属性更改时将此 TypeOfInvestmentFormSavedWork 属性更新为 _savedWork 的新值。出于某种原因,这会触发 DisplayTypeOfInvestment View 模型的 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");
}
}
当调用 Add 方法时,if 语句停止在 DisplayInvestmentFund 中更改奇怪的属性。
我意识到这个答案没有多大意义,但对我来说要详细解释这个问题会花费非常很长时间。我也意识到这可能意味着我的代码不好。我不知道该怎么做。感谢大家的帮助。
最佳答案
我的猜测是您在 OnPropertyChanged
调用的事件处理程序之一中分配给 Amount
。
另一种可能性是您在 SavedWork.Amount
的 setter 中有代码再次调用 YourClass.Amount
。
但是你为什么不直接调试呢?只需在 Visual Studio 调试器中逐步执行代码。
堆栈跟踪应该也很有用。通过无休止的递归,您通常会得到一个重复的方法序列。如果我的猜测是正确的,重复的部分将是这样的:
MyClass.set_Amount
MyClass.OnPropertyChanged
OtherClass.myClass_amount_changed
关于c# - 没有无限循环的堆栈溢出异常(据我所知),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004501/