2017-05-31 70 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{}{}