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
中的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
,而第一次调用未完成。
这意味着计时器不会等待上一个调用完成,然后再发出新的调用。
如果这是您想要的行为,那么它很好。
如果没有,那么你可以用一个简单的循环替换你的应用程序,并使用如下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