문제

작은 코드 샘플이 있습니다.

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로 이동하여 일부 업데이트를 한 다음 getAllitems를 호출하는 방법으로 컬렉션을 다시 채워야합니다.

이 유형의 코드는 winformsapp에서 스택을 던지고 있습니다. 두 가지 질문이 있습니다.
1.이 유형의 예외는 동일한 코드를 사용하여 Winservice 응용 프로그램에 던져 집니까?
2. 자체 대화 방법 대신 타이머를 사용한다는 의견은 무엇입니까?

도움이 되었습니까?

해결책

"자체 대화 방법"을보다 정확하게 "재귀 방법". 당신의 솔루션은 창의적입니다. 나는 당신에게 그것을 줄 것입니다. 그러나하지 마십시오. 스택 공간은 매우 제한적입니다. 서비스로 이동할 때이 문제를 볼 수 있으며이를 처리하는 더 나은 방법이 있습니다. 서비스에 사용될 때 타이머는 매우 적절합니다.

다른 팁

귀하의 경우 방법을 호출하는 재귀는 다음과 같습니다 나쁜 타이머를 사용하여 수행합니다. 당신은하지 않아야합니다 !!

간단한 루프를 사용하고 사이에 잠을자는 스레드를 보내십시오.

MS IL에는. 테일 op 코드가 있습니다. 그러나 C# dot은 꼬리 재귀를 인식하고 싶어합니다 (. 그건 그렇고, 꼬리 재귀는 .NET에서 너무 느립니다.

왜 전혀 재발해야합니까? 방법이 재귀를 중지하고 체인을 종료 할 수있는 유량 제어 명령문은 없습니다. 무한 재귀는 아마도 오버플로를 일으키는 원인 일 것입니다. 더 나은 해결책은 재귀를 완전히 없애는 것입니다. 다른 래퍼를 제거하면 재발하지 않고도 동일한 결과를 얻을 수 있습니다.

private void MonitorItems()
{
    if(someCondition)
    {
        dateSelected = DateTime.Now;
        GetAllItems();
    }
    if(allItems.Count>0)
        CheckAllItems();
}

이것은 루프에 갇히지 않고 동일한 결과를 달성합니다. 그런 다음 실행 환경의 맥락에서 통화를 반복하는 규칙을 구현할 수 있습니다. 버튼은 양식을 클릭하거나 서비스 응용 프로그램의 타이머를 클릭하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top