2014-09-05 3 views
1

Compact Framework를 사용하는 데이터 수집기 ​​용 소프트웨어를 개발합니다.CF의 타이머가 틱하지 않음

내가 호출하는 모든 메서드에 대한 검사를 수행하고 있으며이 메서드가 수행하는 데 걸리는 시간을 계산합니다. 이 시간이 1 분 이상이면 예외를 던질 것입니다. 나는 이것을 가지고있다 :

public static TResult Call<TResult>(Func<TResult> closure) 
    { 
     int ellapsedSeconds = 0; 
     Timer timer = new Timer { Interval = 1000, Enabled = true }; 
     timer.Tick += delegate 
     { 
      ellapsedSeconds++; 
      if (ellapsedSeconds < 60) return; 
      timer.Enabled = false; 
      throw new Exception(@"TimeOut Error Again!"); 
     }; 

     try 
     { 
      TResult result = closure.Invoke(); 
      timer.Enabled = false; 
      return result; 
     } 
     catch (Exception) 
     { 
      timer.Enabled = false; 
      throw; 
     } 
    } 

나는 다른 방법으로 점검 할 수 있음을 알고 있지만 이것을 바꾸려하지 않는다. 내가 안에 문제 도메인을 올렸지 만, 실제로는 Timer은 틱 이벤트를 발생시키지 않습니다. 데스크톱 응용 프로그램과 마찬가지로 .Start() 또는 .Stop()이라는 확장 방법이 없습니다. timer.Enabled = true;은 틱 (tick)을 시작하지 않습니다. 에 찾는 위치 :

enter image description here

어떻게 컴팩트 프레임 워크와 타이머를 시작할 수 있습니까?

+0

UI 스레드를 차단하고 있습니까? –

+1

타이머는 메서드에 대해 로컬입니다. 똑딱 거리기를 생각하기 전에 GC'd가 될 것입니다. –

+0

정말 방법에 국한됩니다. 정적 클래스이기 때문에 전역 멤버로 적용 할 수 없습니다. –

답변

3

타이머는 호출자 스레드에있는 Windows 메시지 펌프를 사용합니다. 이런 방식으로 TimerTick 이벤트를 수신하지 않습니다.

대신 BeginInvoke 기술을 사용해보세요. 이 기술은이 기사의 Calling Synchronous Methods Asynchronously에 설명되어 있습니다.

2

두 개의 타이머가 있습니다. 하나는 System.Windows.Forms에 있고 다른 하나는 System.Threading.Thread에 있습니다.

폼 기반 타이머에는 Tick 이벤트 처리기를 실행하는 WM_TIMER 메시지를 보낼 때 실행중인 메시지 펌프가 필요합니다. Tick ​​처리기는 GUI가 차단 된 경우 호출되지 않으며 장치가 일시 중단되었을 때 실행되지 않습니다. http://msdn.microsoft.com/en-us/library/system.windows.forms.timer_members%28v=vs.90%29.aspx Forms 타이머에는 Start() 또는 Stop() 메서드가 없지만 Enabled = true 및 false를 사용하면 시작되고 중지됩니다.

스레드 기반 타이머 스레드를 사용하고 경과 콜백 호출이로, 당신은 목적을 위해 잘못된 하나 인 양식 타이머를 선택한 http://msdn.microsoft.com/en-us/library/system.threading.timer%28v=vs.90%29.ASPX

(GUI 또는 APP가 걸려 있는지 확인을) 메시지 펌프가 차단되면 타이머가 호출되지 않습니다. 스레드 타이머로 전환해야합니다.

관련 문제