세 가지가 있습니다 Timer
클래스가 내가 알고 오전, System.Threading.Timer
, System.Timers.Timer
,와 System.Windows.Forms.Timer
,이 중에는 없다 .Reset()
0으로 현재의 경과 시간을 재설정 할 기능을.
이 기능이있는 BCL 클래스가 있습니까? 해킹이 아닌 방법이 있습니까? (시간 제한을 변경하면 재설정 될 수 있다고 생각했습니다.) Timer
이 기능이 있는 클래스 를 다시 구현하는 것이 얼마나 어려울 지 또는 BCL 클래스 중 하나를 사용하여 안정적으로 수행하는 방법에 대해 생각하십니까?
답변
나는 항상한다 …
myTimer.Stop();
myTimer.Start();
… 그게 해킹인가요? 🙂
Threading.Timer에 대한 의견에 따라 Change 메서드입니다 …
dueTime 유형 :
System.Int32
Timer가 생성 될 때 지정된 콜백 메서드를 호출하기 전에 지연되는 시간 (밀리 초)입니다.Timeout.Infinite
타이머가 다시 시작되지 않도록 지정
합니다. 타이머를 즉시 다시 시작하려면 영 (0)을 지정하십시오.
답변
모든 타이머는 System.Threading.Timer를 제외하고 Start () 및 Stop () 메서드에 해당합니다.
따라서 다음과 같은 확장 방법 …
public static void Reset(this Timer timer)
{
timer.Stop();
timer.Start();
}
…이 문제를 해결하는 한 가지 방법입니다.
답변
의 경우 System.Timers.Timer
MSDN 설명서에 따르면 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
답변
Reset ()이라는 확장 메서드를 작성할 수 있습니다.
- Timers.Timer 및 Forms.Timer에 대해 Stop ()-Start () 호출
- Threading.Timer에 대한 Change 호출
답변
타이머에 새 값을 할당했습니다.
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
}
답변
다른 주석이 잘못 되었기 때문에 명확성을 위해 System.Timers
Enabled를 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()
있습니다.
답변
타이머 (System.Windows.Forms.Timer)의 경우.
.Stop, .Start 메서드는 재설정으로 작동했습니다.