Vb.net 如何使sub-main像表单一样工作?

Vb.net 如何使sub-main像表单一样工作?,vb.net,multithreading,timer,main,Vb.net,Multithreading,Timer,Main,VB.NET。 试图使子主键的行为类似于窗体。从某种意义上说,它不会消耗处理器,并且Sub-Main会无限期地运行,计时器事件大约每秒触发一次 下面的代码给出了我想要的行为,但我不完全理解EventWaitHandle是如何工作的。我的问题是。。。是否有人知道这是一个好方法,或者是否有一种更简单的方法,让一个Sub-Main基本上什么都不做,只允许触发计时器事件 Imports System.Threading Module MainMod Public Sub Main(args As

VB.NET。

试图使
子主键
的行为类似于窗体。从某种意义上说,它不会消耗处理器,并且
Sub-Main
会无限期地运行,计时器事件大约每秒触发一次

下面的代码给出了我想要的行为,但我不完全理解
EventWaitHandle
是如何工作的。我的问题是。。。是否有人知道这是一个好方法,或者是否有一种更简单的方法,让一个Sub-Main基本上什么都不做,只允许触发计时器事件

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
通常用于在不同线程之间进行同步。它允许一个线程等待另一个线程通知发生了什么

在我看来,你并不需要这个功能,你只需要等待

您只需调用
控制台.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
关于代码的另一个注释是,如果第一次调用花费的时间超过1秒(计时器周期值),则使用
System.Threading.Timer
类将导致第二次调用
ontimerecursed
,而第一次调用未完成

这意味着计时器在发出新调用之前不会等待上一次调用完成

如果这是你想要的行为,那就好了

如果没有,则可以用一个简单的循环替换应用程序,并使用
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 

嗯。。。什么?winforms应用程序中也存在(并且需要)main sub。它被称为。默认情况下,它是通过MyApplication类自动生成的。您始终可以创建自定义AEP并将启动窗体设置为main sub。不清楚您为什么需要这种行为。根据您希望sub执行的操作,可能还有其他方法-您是否能够发布您正在使用的代码或解释有关程序的更多信息?谢谢