如何使子主体表现得像?

时间:2015-10-17 05:12:28

标签: vb.net multithreading timer main

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

1 个答案:

答案 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