【问题标题】:How to make sub main behave like form?如何使 sub main 表现得像表单?
【发布时间】:2016-01-15 22:41:27
【问题描述】:

VB.NET.

试图使 Sub Main 表现得像一个表单。从某种意义上说,它不会消耗处理器并且Sub Main 会无限期地运行,并带有一个大约每秒触发一次的计时器事件。

下面的代码为我提供了我想要的行为,但我不完全理解 EventWaitHandle 的工作原理。我的问题是......有谁知道这是否是一种好方法,或者是否有一种更简单的方法来拥有一个基本上不做任何事情但允许触发 Timer 事件的 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

【问题讨论】:

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

标签: vb.net multithreading timer main


【解决方案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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-25
    • 2012-11-24
    • 2017-06-19
    • 2017-01-26
    • 1970-01-01
    • 2014-08-17
    • 2011-08-08
    • 1970-01-01
    相关资源
    最近更新 更多