【发布时间】:2013-11-15 14:58:36
【问题描述】:
我在旧应用程序(不是我自己编写的)中遇到了一个奇怪的错误,当我更改日历上的日期时,我遇到了 StackOverflow 异常。
下面是一个简化版本。这是包含两个控件的 Windows 窗体的代码隐藏,一个名为 label2 的标签和一个名为 MonthCalendar 的日历,名为 monthCalendar1。
我认为这里的想法是创建打字机效果。我在 XP 上,我的同事在 Windows 7 上可以运行:
private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
{
const string sTextDisplay = "Press Generate button to build *** Reports ... ";
for (var i = 0; i < 45; i++)
{
label2.Text = Mid(sTextDisplay, 1, i);
System.Threading.Thread.Sleep(50);
//Error on this line
//An unhandled exception of type 'System.StackOverflowException' occurred in System.Windows.Forms.dll
Application.DoEvents();
}
}
public static string Mid(string s, int a, int b)
{
var temp = s.Substring(a - 1, b);
return temp;
}
我看不到堆栈跟踪,我只看到:
{无法计算表达式,因为当前线程处于堆栈溢出状态。}
另外,我对 cmets 很感兴趣,他们问我为什么没有检查 StackOverflow 异常的堆栈跟踪,因为它看起来像 this isn't possible,至少没有第三方工具。
这可能是什么原因造成的?谢谢
【问题讨论】:
-
可能是 Application.DoEvents();触发monthCalendar1_DateChanged(...)?
-
看看调试器...堆栈是什么样的?这会很明显
-
啊,没有什么比对别人的混淆编程投一些反对票更痛苦的了::sympathy::::
-
@P.Brian.Mackey 是的,尽管在不查看堆栈的情况下询问有关 StackOverflowException 的问题显然是有问题的(在任何人跳到我面前之前 - 我没有投反对票;))跨度>
-
XP 版本的 MonthCalendar 相当古怪,在 Vista 中得到了很大改进。并不是说你不能让这段代码表现得不好,只是依靠光标键来获得任意递归。请改用计时器。
标签: c# winforms stack-overflow doevents