2017-05-31 4 views
2

Ich habe eine Schleife, die für eine gewisse Zeit schläft. An anderer Stelle in meinem Code muss ich diese Ruhezeit möglicherweise vorzeitig beenden, damit die nachfolgende Logik schneller ausgeführt werden kann.Trigger-Timer vorzeitig

for { 
    timer = time.NewTimer(30 * time.Second) 
    <-timer.C 
    // Do something 
} 

Anderswo ...

// Trigger timer 
// timer.Trigger() ?? 

Natürlich timer.Stop() den Timer stoppen, aber es wird das Programm zu hängen und nicht fallen bis auf // Do something dann verursachen. Momentan setze ich den Timer auf eine sehr kurze Zeit zurück, so dass der Timer grundsätzlich sofort abläuft.

timer.Reset(time.Millisecond) 

Gibt es einen besseren Weg, dies zu tun?

Antwort

2

können Sie einen Storno Kanal verwenden:

cancel := make(chan struct{}) 
for { 
    timer = time.NewTimer(30 * time.Second) 
    select { 
    case <- timer.C: 
     doSomething() 
    case <- cancel: 
     doSomething() 
    } 
} 

Wenn Sie den Timer ignorieren wollen und sofort ausgeführt werden, nur eine Nachricht auf dem cancel Kanal senden:

cancel <- struct{}{} 
Verwandte Themen