2010-06-16 3 views
3

이 타이머의 요점은 자정 때마다 일부 코드를 실행하는 것입니다. 기본적으로 첫 번째 간격은 Now와 자정 사이가되며 그 이후의 모든 간격은 24 시간이됩니다.타이머 및 가변 간격에 관한 질문

이제 모든 것이 잘되고 좋지만이 타이머 비즈니스가 어떻게 작동하는지 궁금합니다. 타이머가 재설정 될 때마다 MyTimer.Interval이 다시 계산됩니까?

System.Timers.Timer MyTimer = new System.Timers.Timer(); 
MyTimer.Elapsed += new ElapsedEventHandler(TriggeredMethod); 
MyTimer.Interval = [pseudocode]Time between now and midnight[/pseudocode]; 
MyTimer.Start(); 

편집 :

나는 문제가 내 TriggerMethod 내부의 간격을 설정하는 데 문제가 있습니다. 문맥 오류가 발생하지 않도록 어디서/어떻게 타이머를 시작해야합니까?

private void Form1_Load(object sender, EventArgs e) 
{ 
System.Timers.Timer MyTimer = new System.Timers.Timer(); 
MyTimer.Elapsed += new ElapsedEventHandler(TriggeredMethod); 
MyTimer.Start(); 
} 

private void TriggerMethod(object source, ElapsedEventArgs e) 
{ 
MyTimer.Interval = [pseudocode]Time between now and midnight[/pseudocode]; 
} 

답변

4

Interval 속성은 타이머 호출 간격 (밀리 초)입니다.

자정에 타이머를 실행하려면 각 Elapsed 이벤트에서 Interval(int)(DateTime.Today.AddDays(1) - DateTime.Now).TotalMilliseconds으로 변경해야합니다.

Elapsed 핸들러 내부 타이머에 액세스하려면 다음과 같이 클래스의 필드에 타이머를 저장해야합니다 :

System.Timers.Timer MyTimer 
private void Form1_Load(object sender, EventArgs e) 
{ 
    MyTimer = new System.Timers.Timer(); 
    //... 
} 

주, 그런데, System.Timers.Timer가 발생하지 않습니다 UI 스레드
따라서 Elapsed 처리기 내부에서 양식을 조작 할 수 없습니다.
양식을 조작해야하는 경우 정확도가 낮은 System.Windows.Forms.Timer으로 전환하거나 BeginInvoke으로 전화 할 수 있습니다.

+0

Tick 이벤트가 의미하는 바를 명확히 할 수 있습니까? 타이머에 의해 트리거되는 메소드 내부에서 Interval을 다시 할당해야합니까? – sooprise

+0

네, 맞습니다. 클래스의 필드에'MyTimer'를 저장해야합니다. – SLaks

+0

'System.Timers.Timer MyTimer; '를'Form_Load' 메소드 외부로 이동하십시오. – SLaks

1

처음 실행 한 후에는 다음 날 자정부터 현재 시간을 뺀 다음 해당 간격에 할당해야합니다. 내 일괄 처리 과정 중 하나를 위해이 작업을 수행하고 잘 작동합니다.

HTH.

+0

처음 실행 한 후에 어떻게 간격을 변경할 수 있습니까? 첫 번째 실행이 완료되었는지 아닌지를 어떻게 결정할 지 모르겠다. – sooprise

+0

'TriggeredMethod'에'MyTimer.Interval'을 설정해야합니다. – SLaks

+0

@SLaks, 이봐, Timer 객체의 컨텍스트에 대해 혼란스러워. 나는 원래의 글을 편집 해 주었다. 내가 도와 주면 정말 고맙다. – sooprise

0

타이머를 한 시간에 한 번씩 실행 한 다음 자정에 한 번만 실제 작업을 수행하십시오. 또한 BeginInvoke를 사용하여 실제 UI 상호 작용을 GUI 스레드로 이동하는 것이 좋습니다.