我有一个小的代码示例:Stack.Overflow错误 - WinForms应用程序比。 WINSERVICE
private void MonitorItems()
{
if (someCondition)
{
dateSelected = DateTime.Now;
GetAllItems();
}
else
{
if(allItems.Count>0)
CheckAllItems();
}
MonitorItems();
}
的方法GetAllItems进入数据库,并获得集合中的所有新项目 - > 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)我需要去DB,做一些更新,然后再次调用该方法GetAllItems填充集合allItems。
这种类型的代码在WinFormsApp中抛出Stack.Overflow异常。 我有两个问题:
1.是否会在WinService应用程序中使用相同的代码抛出此类异常?
2.您对使用计时器而不是自我调用方法有何看法?
第一次实施计划与计时器。但我有一个问题。计时器在1秒内设置为“滴答”。如果CheckAllItems()中的工作未完成并且计时器再次打勾,会发生什么情况?关于代码的一点说明:必须有递归调用,以便监控不会停止。 – ZokiManas 2009-10-27 07:07:47
@ZM:如果使用System.Timers.Timer类,并且在前一个事件处理完成之前计时器再次打勾,则会在另一个线程上再次调用您的处理程序。确保你的代码可以处理(换句话说,确保你的代码是可重入的)。如果你不想要这种行为,你可以在处理程序中停止()定时器,然后在完成时再次启动()。 – 2009-10-27 15:19:43
@ZM:如果以前不清楚,递归调用不只是一个坏主意,它们是一个非常糟糕的主意。不要这样做。 – 2009-10-27 15:20:32