VB.NET点。
试图使Sub Main
表现得像一个表格。从某种意义上说它不消耗处理器并且Sub Main
无限期地保持运行,定时器事件每秒会触发一次。
下面的代码为我提供了我想要的行为,但我并不完全理解EventWaitHandle
的工作原理。我的问题是......有没有人知道这是一个好的方法,还是可能有一个更简单的方法来让Sub Main基本上什么都不做但只允许一个Timer事件触发?
Imports System.Threading
Module MainMod
Public Sub Main(args As String())
Dim waitHandle = New System.Threading.EventWaitHandle(True, EventResetMode.AutoReset, "", False)
Dim timer = New Timer(AddressOf OnTimerElapsed, Nothing, TimeSpan.Zero, TimeSpan.FromSeconds(1))
Do While True
waitHandle.WaitOne(TimeSpan.FromSeconds(20))
Loop
End Sub
Private Sub OnTimerElapsed(state As Object)
Debug.WriteLine(DateAndTime.Now.ToString)
End Sub
End Module
答案 0 :(得分:1)
EventWaitHandle
实际上并没有做任何特别的事情。它只是让你无限期等待。但是,这不是EventWaitHandle
的标准用法。 EventWaitHandle
通常用于在不同线程之间进行同步。它允许一个线程等待另一个线程发出信号表明发生了什么。
在我看来,你不需要这个功能,你只需要等待。
您只需致电Console.ReadLine
即可。这将导致主线程等待,但如果用户输入一行,将导致应用程序退出。
另一种方法是使用Thread.Sleep
,这将导致主线程也等待。将它置于循环中将导致主线程无限期地等待。
请考虑以下代码:
Public Sub Main(args As String())
Dim timer = New Timer(AddressOf OnTimerElapsed, Nothing, TimeSpan.Zero, TimeSpan.FromSeconds(1))
Do While True
Thread.Sleep(TimeSpan.FromSeconds(20))
Loop
End Sub
Private Sub OnTimerElapsed(state As Object)
Debug.WriteLine(DateAndTime.Now.ToString)
End Sub
关于你的代码的另一个评论是,使用System.Threading.Timer
类将导致OnTimerElapsed
第二次被调用,而第一次调用未完成,如果第一次调用花费的时间超过一秒(计时器周期值)完成。
这意味着Timer在发出新的调用之前不会等待先前的调用完成。
如果这是你想要的行为,那就没关系了。
如果没有,那么您可以用简单的循环替换您的应用程序并使用Thread.Sleep
,如下所示:
Public Sub Main(args As String())
Do While True
Thread.Sleep(TimeSpan.FromSeconds(1))
OnTimerElapsed()
Loop
End Sub
Private Sub OnTimerElapsed()
Debug.WriteLine(DateAndTime.Now.ToString)
End Sub