2013-04-08 2 views
1

정확하게 5 분마다 실행하는 방법이 필요합니다. 나는 Timer가 천천히 동기화되지 않는다는 것을 알아 차렸기 때문에 Timer를 사용할 수 없습니다 (예 : 00 : 01, 00:06, 00:11, 00:16 등).Java의 timer.scheduleAtFixedRate와 동일한 C#

정확해야하지만 너무 정확하지 않아도됩니다. 매 5 분마다 +/- 1 초가 괜찮을 것이며, 달리기 하루 만 지나면 5 분간 정확하게 틱할 것입니다.

내가 지금까지 생각한 것은 1 초의 간격으로 Timer를 작성하여 DateTime.Now를 검사하여 다음 5 분 표시가 통과되는지 확인하는 것입니다. 내가 놓친 C# 라이브러리에 좀 더 우아한 솔루션이나 무언가가 있는지 궁금합니다.

편집 : 지금 내 요구 사항에 맞는 다음 템플릿이 있습니다.

public class ThreadTest 
{ 
    private Thread thread; 
    private long nextExecutionTime; 
    private long interval; 

    public void StartThread(long intervalInMillis) 
    { 
     interval = intervalInMillis * TimeSpan.TicksPerMillisecond; 
     nextExecutionTime = DateTime.Now.Ticks; 
     thread = new Thread(Run); 
     thread.Start(); 
    } 

    private void Run() 
    { 
     while (true) 
     { 
      if (DateTime.Now.Ticks >= nextExecutionTime) 
      { 
       nextExecutionTime += interval; 
       // do stuff 
      } 
     } 
    } 
} 
+4

System.Threading.Timer를 실제로 사용해 보셨습니까? 그것은 지정된 간격마다 새 스레드를 시작하고 나는 1 초 이상 동기화되지 않습니다. –

+0

Timer의 유일한 문제점은 작업자 스레드가 너무 오랫동안 정지되거나 실행될 때 새로운 스레드와 새 스레드를 시작하고 응용 프로그램이 너무 많은 리소스를 소비한다는 것입니다. 그런 상황이 부적절한 경우도 있습니다. 그런 다음주기적인 러너를 직접 구현할 수 있습니다. 그렇지 않으면 타이머를 사용하십시오 –

+0

방금 ​​System.Threading.Timer를 1 초 간격으로 시도했는데 4 분에 230ms를 얻었습니다 – Tom

답변

0

타이머가 만족스럽지 않으십니까?

당신이 대신 타이머을

사용하는 5 분째예요에 대한 귀하의 스레드 잠을 만들기 위해 노력하고 있습니다 , 모양이있는 것이

using System; 
using System.Threading; 

public class Worker 
{ 
    // This method will be called when the thread is started. 
    public void DoWork() 
    { 
     while (!_shouldStop) 
     { 
      Task.Factory.Start(() => 
       { 
        // do you task async 
       }) 
      Thread.Sleep(300000); 
     } 
    } 

    public void DoWork2() 
    { 
     var watch = new Stopwatch(); 
     while (!_shouldStop) 
     { 
      watch.Start(); 
      Task.Factory.Start(() => 
       { 
        // do you task async 
       }) 

      while(watch.Elapsed.ElapsedMilliseconds < 300000); 
      watch.Stop(); 
      watch.Reset(); 
     } 
    } 

    public void RequestStop() 
    { 
     _shouldStop = true; 
    } 

    private volatile bool _shouldStop; 
} 

public class WorkerThreadExample 
{ 
    static void Main() 
    { 
     // Create the thread object. This does not start the thread. 
     Worker workerObject = new Worker(); 
     Thread workerThread = new Thread(workerObject.DoWork); 

     // Start the worker thread. 
     workerThread.Start(); 

     // Loop until worker thread activates. 
     while (!workerThread.IsAlive); 

     while (true) 
     { 
      //do something to make it break 
     } 

     // Request that the worker thread stop itself: 
     workerObject.RequestStop(); 
     workerThread.Join(); 
    } 
} 

도움이되기를 바랍니다 또는 당신이 시도 할 수 있습니다 :

+2

작업을 수행하는 데는 5 분마다 실행되지만 시간이 오래 걸립니다. 내 작업을 실행하는 데 30 초가 걸리면 5 분 30 초마다 실행됩니다. – Tom

+1

물론입니다. 나는 그것이 5 분 이상 걸리지 않는 한 작업이 실제로 어떻게 취했는지 (DateTime.Now - someTimeBefore) .TotalSeconds)를 알아내는 것은 꽤 쉽다 고 생각한다. Timer보다 나은 것을 얻지 못한다면, 이것은 아마도 DateTime을 지속적으로 확인하는 1 초의 간격으로 Timer를 생성하는 것보다 낫습니다. 다음 5 분이 지나면 볼 수 있습니다. ' –

+0

그런데, 만약 당신이 이제까지 시간을 세고 싶다. 스톱워치를 시험해보고 싶다. DateTime보다 더 정확해야한다. –

관련 문제