c# - 没有无限循环的堆栈溢出异常(据我所知)

标签 c# wpf xaml entity-framework-4 stack-overflow

我有一个堆栈溢出错误,我很确定我没有任何类型的无限递归(至少我已经盯着这个错误看了几个小时了,我无法想象它是如何循环的无限)。

代码如下:

    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 的工具,但我找不到太多关于如何安装/使用它们的信息。这些工具是正确的方法吗?

或者,如果有一个无限循环或其他会很棒的东西。

编辑

正如我在评论中所说,这是为 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/

相关文章:

c# - 打印总和为特定值的所有子集

python - Visual Studio Python WPF 调试

.net - 如何在wpf中添加.net图表组件

c# - 在 MapItemsControl.ItemTemplate 中绑定(bind)网格的 EntranceThemeTransition 属性不起作用

wpf - 如何在设计器中渲染更多/任何内容?

c# - 从子窗体导航到其同级窗体

c# - 从域中获取 SPF 记录

c# - PInvoke PostMessage 不能跨用户帐户工作

wpf - MVVM 模式 - 执行 View 操作

c# - 在 rtf 字符串的位置追加文本