我有一個小的代碼示例: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