我正在尝试从渠道获取信息,但是看起来我的代码在执行常规操作后没有运行。 我的两个例程都在工作,第一个例程正在收集信息,最后一个正在监视填充,如果填充结束,第二个例程将停止这两个例程 例行程序后如何获取信息并获得运行代码?也许有什么正确的方法来获取信息?
func main() {
watcher, _ := winlog.NewWinLogWatcher()
watcher.SubscribeFromBeginning("Application", `*`)
i := 0
c := make(chan bool)
go func() {
for {
if flag == true {
return
}
select {
case evt := <-watcher.Event():
i+=1
var event Event
data := []byte(evt.Xml)
_ = xml.Unmarshal(data, &event)
Events = append(Events, event)
case err := <-watcher.Error():
break
}
}
}()
go func() {
for {
if flag == true {
break
}
if I == 0 || I != i {
I = i
}
time.Sleep(time.Millisecond * 100)
if i == I && flag == false{
flag = true
}
time.Sleep(time.Millisecond * 10)
}
}()
<-c
// *** i cant print this info ***
time.Sleep(10*time.Millisecond)
fmt.Println(`Events counter:`, len(Events))
}
答案 0 :(得分:4)
从通道<-c
进行的读取正在阻止操作。
由于您不写此通道,因此从该通道读取后将阻止进一步的操作。
您可以使用sync.WaitGroup
wg := &sync.WaitGroup{}
wg.Add(1)
go func () {
defer wg.Done()
...
}
wg.Wait()