C #에서 타이머를 재설정하는 방법은 무엇입니까?


114

세 가지가 있습니다 Timer클래스가 내가 알고 오전, System.Threading.Timer, System.Timers.Timer,와 System.Windows.Forms.Timer,이 중에는 없다 .Reset()0으로 현재의 경과 시간을 재설정 할 기능을.

이 기능이있는 BCL 클래스가 있습니까? 해킹이 아닌 방법이 있습니까? (시간 제한을 변경하면 재설정 될 수 있다고 생각했습니다.) Timer이 기능이 있는 클래스 를 다시 구현하는 것이 얼마나 어려울 지 또는 BCL 클래스 중 하나를 사용하여 안정적으로 수행하는 방법에 대해 생각하십니까?


3
JP의 솔루션을 사용하여 확장 메서드
benPearce

나도 리셋에 대해 동일한 필요가 같은 이유는 언급에 대해,은 FileSystemWatcher는 불쾌하고 불편 사용에
존 르윈

타이머에 Stopwatch를 사용하고 확장 메서드 응답으로 이동하는 경우 Stopwatch.Restart 확장 메서드가 .NET 4.0에서 제공되므로주의하십시오. msdn.microsoft.com/en-us/library/…
si618

답변:


148

나는 항상한다 ...

myTimer.Stop();
myTimer.Start();

... 그게 해킹인가요? :)

Threading.Timer에 대한 의견에 따라 Change 메서드입니다 ...

dueTime 유형 : System.Int32Timer가 생성 될 때 지정된 콜백 메서드를 호출하기 전에 지연되는 시간 (밀리 초)입니다. Timeout.Infinite타이머가 다시 시작되지 않도록 지정 합니다. 타이머를 즉시 다시 시작하려면 영 (0)을 지정하십시오.


다른 문제는 Forms.Timer로만 문제가 발생하고 내 앱에는 GUI가 없기 때문에 (매개 변수가없는 Application.Start ()) Threading.Timer 클래스가 다른 이유로 더 좋지만 좋은 점이라고 생각합니다.
Matthew Scharley 09-06-25

3
@Matthew : 다양한 타이머 클래스와 적절한 사용시기에 대한 설명은 msdn.microsoft.com/en-us/magazine/cc164015.aspx 를 참조 하십시오 . 그러나 일반적으로 Forms.TimerGUI에서만 사용해야합니다. 그러나 이외에 Forms.TimerThreading.Timer도있다 Timers.Timer.
Brian

60

모든 타이머는 System.Threading.Timer를 제외하고 Start () 및 Stop () 메서드에 해당합니다.

따라서 다음과 같은 확장 방법 ...

public static void Reset(this Timer timer)
{
  timer.Stop();
  timer.Start();
}

...이 문제를 해결하는 한 가지 방법입니다.


1
경과 시간을 측정하는 것이 아닙니다. 이것에 대한 정확한 사용 사례는 FileSystemWatcher가 디렉토리를 감시하고 변경 그룹 (예 : 서로 5 초 이내의 변경)을 포착하고 싶다는 것입니다. 이론은 첫 번째 변경이 결국 그룹을 실행하고 닫을 때까지 변경 될 때마다 재설정되는 타이머를 시작한다는 것입니다.
Matthew Scharley 09-06-25

네, 질문을 다시 읽을 때 발견했습니다. 내 대답을 수정했습니다.
Dan

이 방법은 작동하며을 호출하는 경우에만 작동하지 않는다는 점에 유의해야합니다 timer.Start(). 이 Linqpad 쿼리 를 만들어 테스트했습니다. timer.Stop그것을 제거 하면 차이를 볼 수 있습니다.
Jared Beach

30

의 경우 System.Timers.TimerMSDN 설명서에 따르면 http://msdn.microsoft.com/en-us/library/system.timers.timer.enabled.aspx :

타이머가 시작된 후 간격이 설정되면 카운트가 재설정됩니다. 예를 들어 간격을 5 초로 설정 한 다음 Enabled 속성을 true로 설정하면 Enabled가 설정된 시간에 카운트가 시작됩니다. count가 3 초일 때 간격을 10 초로 재설정하면 Enabled가 true로 설정된 후 13 초 동안 Elapsed 이벤트가 처음으로 발생합니다.

그래서,

    const double TIMEOUT = 5000; // milliseconds

    aTimer = new System.Timers.Timer(TIMEOUT);
    aTimer.Start();     // timer start running

    :
    :

    aTimer.Interval = TIMEOUT;  // restart the timer

1
여기서 문제는 타이머가 이미 실행 중인지 여부를 재설정하려는 순간에 항상 알 수 없다는 것입니다. 따라서 aTimer.Interval = TIMEOUT 및 aTimer.Start ()를 수행해야합니다. 따라서 전체적으로 위의 재설정 기능은 줄과 변수를 덜 사용합니다. 그래도 큰 추가.
e-

1
@ RU-Bn OP는 " 현재 경과 시간을 0으로 재설정하는 .Reset () 함수 "를 명확하게 명시 합니다. -타이머가 실행 중인지조차 알지 못하는 열악한 설계 응용 프로그램에서 사용하기위한 것임을 언급하지 않습니다. 또한 작성자의 의견 (4 년 이상 전)을 확인하십시오. " 이론은 첫 번째 변경이 결국 시작되고 그룹이 종료 될 때까지 변경 될 때마다 재설정되는 타이머를 시작한다는 것입니다. ". 어쨌든 반대표에 감사드립니다.
mMontu 2014 년

나는 또한 그런 문제를 보았다. 내가 한 것은 : aTimer.Interval = aTimer.Interval. 그것은 루프가 진행되고 있음을 유발했습니다. 하지만이 작품 ... 왜 저를 구타
헤르만 반 데르 블럼

7

Reset ()이라는 확장 메서드를 작성할 수 있습니다.

  • Timers.Timer 및 Forms.Timer에 대해 Stop ()-Start () 호출
  • Threading.Timer에 대한 Change 호출

5

타이머에 새 값을 할당했습니다.

mytimer.Change(10000, 0); // reset to 10 seconds

그것은 나를 위해 잘 작동합니다.

코드 상단에서 타이머를 정의합니다. System.Threading.Timer myTimer;

if (!active)
        {
            myTimer= new System.Threading.Timer(new TimerCallback(TimerProc));
        }
        myTimer.Change(10000, 0);
        active = true;

private void TimerProc(object state)
    {
        // The state object is the Timer object.
        System.Threading.Timer t = (System.Threading.Timer)state;
        t.Dispose();
        Console.WriteLine("The timer callback executes.");
        active = false;
        //action to do when timer is back to zero
    }

5

다른 주석이 잘못 되었기 때문에 명확성을 위해 System.TimersEnabled를 true 설정하면 경과 시간 재설정됩니다. 방금 아래에서 동작을 테스트했습니다.

Timer countDown= new Timer(3000);

Main()
{
    TextBox.TextDidChange += TextBox_TextDidChange;
    countdown.Elapsed += CountDown_Elapsed;
}

void TextBox_TextDidChange(Object sender, EventArgs e)
{
    countdown.Enabled = true;
}

void CountDown_Elapsed(object sender, EventArgs e)
{
    System.Console.WriteLine("Elapsed");
}

텍스트 상자에 반복적으로 텍스트를 입력하고 타이머는 마지막 키 입력 후 3 초만 실행됩니다. 당신이 볼 수 있듯이 문서에도 암시되어 있습니다.Timers.Start() 하면 Enabled가 true로 설정됩니다.

그리고 확실히 처음부터 곧바로 살펴 보았어야 했지만 이미 활성화 된 타이머를 활성화하면 내부적으로 .NET 을 호출하는 private UpdateTimer()메서드를 호출한다는 것을 .NET 참조 소스 에서 볼 수 Change()있습니다.


아니, 넌 틀렸어. 개인UpdateTtimer 메서드는의 현재 값 Enabled이 new와 같지 않은 경우에만 호출됩니다 value.
Nicolò Carandini

3

타이머 (System.Windows.Forms.Timer)의 경우.

.Stop, .Start 메서드는 재설정으로 작동했습니다.


1

windows.timer를 재설정하는 다른 방법은 다음과 같이 카운터를 사용하는 것입니다.

int tmrCtr = 0;
Timer mTimer;

private void ResetTimer()
{
  tmrCtr = 0;
}

private void mTimer_Tick()
{
  tmrCtr++;
  //perform task
}  

따라서 1 초마다 반복하려는 경우 타이머 간격을 100ms로 설정하고 카운터를 10 주기로 테스트 할 수 있습니다.

타이머가 다른 시간 범위에서 종료 될 수있는 일부 프로세스를 기다려야하는 경우에 적합합니다.


1

나는 이것을한다

//Restart the timer
queueTimer.Enabled = true;

이것은 단지 그것을 가능하게합니다. 사전에 비활성화 된 경우에도 다시 활성화해도 해당 지점까지 수집 된 경과 시간은 변경되지 않습니다.
vapcguy

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.