2012-03-23 2 views
0

저는 내 WPF 애플리케이션 중 하나에서 사용하게 될 스케줄러를 만들고 있습니다.스케줄러에 적합한 타이머 선택

다음은 코드입니다.

// Interface for a scheduled task. 
public interface IScheduledTask 
{ 
    // Name of a task. 
    string Name { get; } 

    // Indicates whether should be task executed or not. 
    bool ShouldBeExecuted { get; } 

    // Executes task. 
    void Execute(); 
    } 

// Template for a scheduled task. 
public abstract class PeriodicScheduledTask : IScheduledTask 
{ 
    // Name of a task. 
    public string Name { get; private set; } 

    // Next task's execute-time. 
    private DateTime NextRunDate { get; set; } 

    // How often execute? 
    private TimeSpan Interval { get; set; } 

    // Indicates whether task should be executed or not. Read-only property. 
    public bool ShouldBeExecuted 
    { 
     get 
     { 
      return NextRunDate < DateTime.Now; 
     } 
    } 

    public PeriodicScheduledTask(int periodInterval, string name) 
    { 
     Interval = TimeSpan.FromSeconds(periodInterval); 
     NextRunDate = DateTime.Now + Interval; 
     Name = name; 
    } 

    // Executes task. 
    public void Execute() 
    { 
     NextRunDate = NextRunDate.AddMilliseconds(Interval.TotalMilliseconds); 
     Task.Factory.StartNew(new Action(() => ExecuteInternal())); 
    } 

    // What should task do? 
    protected abstract void ExecuteInternal(); 
} 

// Schedules and executes tasks. 
public class Scheduler 
{ 
    // List of all scheduled tasks. 
    private List<IScheduledTask> Tasks { get; set; } 

    ... some Scheduler logic ... 
} 

이제 스케줄러에 맞는 .net 타이머를 선택해야합니다. 구독 된 이벤트 틱/경과 된 내부에 tasklist를 통해 이동하여 어떤 작업을 실행해야하는지 확인한 다음 task.Execute()을 호출하여 실행합니다.

몇 가지 추가 정보 내가 만드는 몇 가지 작업은 매 초, 두 번 이상 실행해야하기 때문에 1 초에 설정된 타이머 간격이 필요합니다.

폼에서 사용자 작업을 사용하려면 새 스레드에서 타이머를 실행해야합니까? 어떤 타이머가이 스케줄러에 가장 적합합니까?

답변

1

System.Timers.Timer를 사용합니다. MSDN documentation에서 :

서버 기반 타이머는 다중 스레드 환경에서 작업자 스레드와 함께 사용할 수 있도록 설계되었습니다. 서버 타이머는 스레드간에 이동할 수 있으므로 은 Elapsed 이벤트를 처리하므로Windows 타이머가 정시에 이벤트를 발생시키는 데 더 정확합니다.

수동으로 별도의 스레드에서 시작해야한다고 생각하지 않습니다. WPF가 아닌 Winforms에서 주로 개발되었지만 UI에서 CPU 시간을 훔친 적이 없습니다.

+0

, 내 첫번째 생각이었다 DispatcherTimer, 내 이후 응용 프로그램은 WPF 기반입니다. 다른 스레드에서 필요한 실행 타이머가 아닌 경우 새 스레드에서 taks를 실행하는 System.Times.Timer와 DispatcherTimer의 차이점은 무엇입니까? –

+0

@Andrew, 나는 귀하의 질문에 대해 오해 한 것 같습니다. 이 타이머가 실행되는 동안 UI의 응답성에 우려하는 것 같습니다. 이 점에서 System.Timers.Timer의 장점은 다중 스레드 환경에서 사용하도록 설계되었다는 점입니다. 별도의 스레드에서 실행하면 UI에서 어떤 일이 일어나고 있는지에 관계없이 시간에 따라 실행됩니다. 나는 DispatchTimer를 사용하지 않았기 때문에 정말로 말할 수는 없다. 그것은 당신이 필요로하는 것에 더 좋을 수 있습니다, 그것은 아마도 더 많은 연구가 필요할 것입니다. –

0

가가 (귀하의 경우 UI 스레드)를 생성하는 것과 같은 스레드에서 디스패처 큐에 통합 될 때 당신은 DispatcherTimer를 사용한다 : 솔직히

DispatcherTimer timer = new DispatcherTimer(); 
timer.Interval = TimeSpan.FromSeconds(1); 
timer.Tick += new EventHandler(timer_Tick); 
timer.Start(); 
+0

그래, 시도했지만 어떤 이유로 작동하지 않습니다. 그래서 DispatcherTimer를 Timers.Timer로 변경하고 괜찮습니다. 신비입니다. –

+0

@Andrew 정확히 작동하지 않는 것은 무엇입니까? 어떤 오류가 발생하고 있습니까? – Slugart

+0

그게 문제 야. 오류나 예외는 없습니다. Timer는 IsEnabled 속성에 따라 실행 중일뿐입니다. 왜 작동하지 않는지 나는 이해하지 못한다. –

관련 문제