【问题标题】:Windows Forms infinite loop exceptionWindows 窗体无限循环异常
【发布时间】:2016-09-09 10:26:48
【问题描述】:

我很快创建了一个 Windows 窗体项目,该项目加载了具有浮点值的不同文本框的 GUI。其中一些确实已经初始化了一个值。所有文本框都必须在其中一个更改后更新。

public Form1()
{
    InitializeComponent();
    initializeValues();
    calculateValues();
}

public void initializeValues()
{
//textboxes are filled/initialized with default float values
}

public void calculateValues()
{
//here all textboxes are new calculated and updated
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
    calculateValues();
}

private void textBox2_TextChanged(object sender, EventArgs e)
{
    calculateValues();
}

问题: 当我执行这个项目时,它会抛出一个未处理的 StackOverflowException(无限循环或无限递归)。我认为这是因为在 calculateValues() 方法期间,文本框的文本将被更改,然后事件处理程序被激活。这就是无限循环:-(

我必须如何更改上面的代码结构以避免这种情况?

谢谢。

【问题讨论】:

  • 设置断点,单步执行你的代码,你会发现你的怀疑是正确的。只需在之前取消订阅事件,并在更改后重新订阅。
  • 在抛出 Win32 异常时将您的 IDE 设置为中断。您将拥有整个调用堆栈,立即放弃,为什么您有无限循环/无限递归。

标签: windows forms loops infinite eventhandler


【解决方案1】:

您不应该使用和调用“initializeValues();” (死循环的原因)。

第一个解决方案是将 TextBox 的初始值放在 InitializeComponent 中:

MyTextBox.Text = myInitValue;

【讨论】:

  • 为什么常规的非递归函数调用会导致堆栈溢出或无限循环?你太容易下结论了。
【解决方案2】:

我通过将事件更改为“KeyPress”解决了这个问题。在这种情况下,事件不会被方法本身激活。没有更多的无限循环。设置断点和单步执行帮助我理解了“流程”。感谢 CodeCaster。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多