2017-05-31 51 views
2

我有一個睡眠一段時間的循環。但是,在我的代碼中的其他地方,我可能需要提前結束睡眠時間,以便能夠更快地執行後續邏輯。提前觸發定時器

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

別處......

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

當然,timer.Stop()將停止計時,但隨後它會導致程序掛起,而不是下降到// Do something。目前,我將計時器重置爲非常短的時間,以便計時器基本上立即到期。

timer.Reset(time.Millisecond) 

有沒有更好的方法來做到這一點?

回答

2

您可以使用一個抵消通道:

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

當你想忽略計時器並立即執行,只是發送一條消息在cancel道:

cancel <- struct{}{}