我有一个小的代码示例:
private void MonitorItems()
{
if (someCondition)
{
dateSelected = DateTime.Now;
GetAllItems();
}
else
{
if(allItems.Count>0)
CheckAllItems();
}
MonitorItems();
}GetAllItems方法转到DB并获取集合-> allItems的所有新项。然后,使用CheckAllItems方法:
private void CheckAllItems()
{
foreach (Item a in new List<Item>(allItems))
{
switch (a.Status)
{
case 1:
HandleStatus1();
break;
case 2:
HandleStatus2(a);
break;
case 0:
HandleStatus0(a);
break;
default:
break;
}
}
}在某些情况下(在HandleStatus1和HandleStatus2中),我需要访问数据库,进行一些更新,然后再次通过调用方法allItems来填充集合GetAllItems。
这种类型的代码在WinFormsApp中抛出Stack.Overflow异常。我有两个问题:
发布于 2009-10-27 06:08:57
“自调用方法”更准确的叫法是"recursive method"。你的解决方案很有创意,我承认这一点。但不要这么做。堆栈空间非常有限。当你转向一个服务时,你会看到这个问题,而且有更好的方法来处理这个问题。在服务中使用计时器是非常合适的。
发布于 2009-10-27 06:09:07
在你的例子中,递归调用这个方法就像使用一个定时器来做一样糟糕的。你不应该这样做!!
只需使用一个简单的循环,并在两者之间发送线程休眠一段时间。
发布于 2009-10-27 06:11:22
MS IL具有.tail操作码。但是c#点想要识别尾递归(.顺便说一句,尾递归在.net中非常慢((
https://stackoverflow.com/questions/1627575
复制相似问题