작은 코드 샘플이 있습니다.Stack.Overflow 오류 - WinForms App Vs. WinService
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) DB로 이동하여 일부 업데이트를 한 다음 GetItems 메서드를 호출하여 allItems 컬렉션을 다시 채울 필요가 있습니다.
이 유형의 코드는 WinFormsApp에서 Stack.Overflow 예외를 발생시킵니다. 두 가지 질문이 있습니다.
1. 동일한 코드를 사용하여 WinService 응용 프로그램에서이 예외 유형이 throw됩니까?
2. 자기 호출 메소드 대신 타이머를 사용하는 것에 대한 귀하의 의견은 무엇입니까?
첫 번째 구현은 타이머를 사용하도록 계획되었습니다. 하지만 한 가지 문제가있었습니다. 타이머가 1 초에 눈금으로 설정됩니다. CheckAllItems() 작업이 완료되지 않고 타이머가 다시 틱하면 어떻게됩니까? 코드에 대한 설명이 거의 없습니다. 재귀 호출이 있어야 모니터링이 중지되지 않습니다. – ZokiManas
@ZM : System.Timers.Timer 클래스를 사용하고 이전 이벤트 처리가 완료되기 전에 타이머가 다시 틱하면 처리기가 다른 스레드에서 다시 호출됩니다. 코드가이를 처리 할 수 있는지 확인하십시오. 즉, 코드가 재진입 가능한지 확인하십시오. 이 동작을 원하지 않으면 처리기에서 타이머를 중지() 한 다음 완료되면 다시 시작() 할 수 있습니다. –
@ZM : 이전에 명확하지 않은 경우 재귀 호출이 나쁜 생각 일뿐만 아니라 ** 정말 나쁜 생각입니다. 하지 마. –