CF 프로젝트 (Windows Embedded CE 6.0), VS2005 C#, .NET 2.0에서 System.Threading.Timer를 사용하고 있습니다. 다음과 같이 사용 재진입의 가능성이 없기 때문에이 타이머가 요구된다Compact Framework에서 System.Threading.Timer 사용
private System.Threading.Timer mainTimer;
private void MainForm_Load(object sender, EventArgs e)
{
// other initializations
mainTimer = new System.Threading.Timer(new TimerCallback(timerMain_Tick),
null, 100, Timeout.Infinite);
}
dueTime 매개 변수를 사용하지만, 기간은하지 않다,라고하는 것입니다. 기간이 Timeout.Infinite 인 경우 타이머는 한 번만 실행됩니다. 타이머는 폼의 InvokeRequired 속성을 확인하여 스레드로부터 안전합니다. null에 대한 검사에 유의하십시오. 그것은 제 질문과 관련이 있습니다.
private void timerMain_Tick(object stateInfo)
{
if (mainTimer != null)
{
if (this.InvokeRequired)
{
this.Invoke((ThreadStart)delegate
{
TimerProcess();
});
}
else
{
TimerProcess();
}
}
}
타이머는 종료하기 전에 다시 시작해야합니다.
private void TimerProcess()
{
try
{
// do work here
}
finally
{
// retrigger
mainTimer.Change(mainTimerInterval, Timeout.Infinite);
}
}
내가 겪고있는 문제는 우아하게이 놈의 것을 멈추고 있습니다.
private void MainForm_Closing(object sender, CancelEventArgs e)
{
// shut down timer
mainTimer.Change(Timeout.Infinite, Timeout.Infinite);
mainTimer.Dispose();
mainTimer = null;
}
어쨌든 타이머가 3 회 발생하고 Object Disposed 오류가 발생합니다. 타이머 코드가 null 확인 후 타이머 메서드를 호출하려고합니다. 타이머가 작동하고 폼이 닫히는 동안 스레드가 일시 중단 된 것으로 의심됩니다. 나는 상태 머신 열거 시도 :
정지 상태에 대한 Thread.sleep를() 루프 상태와 대기를 중지
Form_Closing 세트를 실행 정상 상태
타이머보고 중지 및 세트 상태를 중지됨 (보다는 다시 트리거 자체)
문제 타이머 스레드가 양식 닫기 메서드를 선점하지 않을 것이므로 문제가 발생하지 않으므로 무한 루프에 걸릴 수 있습니다. 이 문제를 해결하는 방법? CF에는 Dispose (WaitHandle) 메서드가 없습니다.
ObjectDisposedException을 처리하고 무시하는 것이 좋습니다. 상관 있니? 나는 전에 모호한 경우에 그것을 했어. – Alan
이것이 결국 내가 한 일이다. 시도하지는 않았지만 아래 @ jp2code의 대답도 실행 가능해 보입니다. 수동으로 타이머를 시작하려고했습니다 : mainTimer.Change (0, Timeout.Infinite); 상태 기계를 '중지됨'상태로 만들지 만 항상 작동하지는 않습니다. 이 객체는 올바르게 동작하지 않습니다. – pwrgreg007