문제

컴팩트 프레임 워크 2, SP2로 C #을 사용하고 있습니다.

장치의 OS가 내 응용 프로그램으로 시작하도록 설정되었으므로 응용 프로그램 "loader.exe"라고합니다.

로더는 단순히 다음과 같습니다. 필요한 경우 LAYMAN의 용어가 있고 "응용 프로그램 시작 [XYZ]"의 LAYMAN의 용어가 실행되는 경우 다음과 같습니다. 기본 전체 화면 양식이 표시되는 동안 백그라운드에서.

로더의 양식의 생성자는 매우 끝에서 다음과 같습니다.

try
{
    label1.Text = "Starting GUI Init Thread...";  //debug only message
    System.Threading.Timer guiInit = new System.Threading.Timer(
        RunStateMachine, null, 2000, System.Threading.Timeout.Infinite
        );
    //callback: RunStateMachine, null argument
    //initial callback is 2000ms from this point, and doesn't run again.
}
catch (Exception ex1)
{
    label1.Text = "GUI Init Error 2";
    Failure_Label.Text = ex1.Message;
}
.

및 "runstateMachine"은 UI와 다른 스레드에서 작동하므로 양식을 표시 할 수 있으며 runstateMachine은 메시지 업데이트와 같은 양식과 상호 작용 해야하는 경우, if (this.invokeRequired) ) {DISTAINVOKE (...); __ \ {...}

그래서, 내 문제?
간헐적으로 내 프로그램이 중단되며 타이머가 콜백을 트리거하지 않았기 때문입니다. 나는 "RunstateMachine"의 시작에있는 메시지를 포함하여 다른 많은 장소와 함께 시도 블록에 디버그 메시지를 추가했습니다. 결국, 내 프로그램은 "GUI init thread 시작 ..."메시지에 매달려

이것은 스레드 타이머가 시간을 실행하지 않는다고 알려줍니다. 내 이론은 콜백을 트리거하는 타이머 이전에 가비지가 수집되어야한다는 것입니다. 이는 타이머가 글로벌이었고, 나는 runstateamachine에 도착했을 때 명시 적으로 처분되는 것을 의미합니다. 그러나 그것은 완벽하게 실행될 것입니다 ... 그러나 나는 지금부터 간헐적 으로이 일을 발견하기 위해 이것을 해결하기 위해 그것을 해결하고 싶지 않습니다.

생각?

도움이 되었습니까?

해결책

내 이론은 타이머 이전에 가비지가 수집되어야한다는 것입니다. 콜백을 트리거합니다.타이머가 글로벌 이었는지, 그런 다음 Runstatemachine에 도착할 때 명시 적으로 처분됩니다. 완벽하게 실행 ...하지만 나는 그것을 발견하기 위해 그것을 해결했다고 생각하고 싶지 않습니다. 이것은 지금부터 간헐적으로 달을 올리고 있습니다.

이 문제가 당신의 문제라는 것을 확인하고 싶습니다. 예, 이것은 문제입니다.

타이머는 다시 사용한 적이없는 로컬 변수에 저장됩니다.이렇게하면 GC를받을 수 있습니다.타이머의 GC '는 타이머를 사용 중지 할 타이머로 이어지는 마무리로 이어집니다.

폼 클래스의 인스턴스 필드에 타이머를 저장하고 콜백이 해고되면

를 삭제합니다.

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