VB.NET 在自己的 "New"语句中的 lambda 表达式中使用自定义计时器 - 可以吗?

标签 vb.net lambda timer compiler-warnings variable-assignment

这有效,我无法想象它会如何导致问题,但 Visual Studio 给了我一个警告,这让我很伤心。我只是想知道这样做是否可能会导致问题:

我有一个自定义计时器,它的作用类似于等待几毫秒,然后执行一个函数。它看起来像这样:

Public Class MyTimer
    Inherits Timers.Timer

    Public Event Done()

    Public Sub New(ByVal interval As Double, ByVal repeat As Boolean, ByVal Work As DoneEventHandler)
        Me.AutoReset = Not repeat
    End Sub

    Private Sub ElapsedToDoneConvert() Handles Me.Elapsed
        RaiseEvent Done()
    End Sub
End Class

我像这样使用它:
Dim Timer as New MyTimer(1000, False, Sub()
                                        ..code..
                                      End Sub)

或者
Dim Timer as New MyTimer(1000, True, Sub()
                                        ..code..
                                      End Sub)

第一种情况等待一秒钟然后执行..code..,第二种情况每隔一秒重复执行..code..。

现在的问题是:想象一下,我有一个表单,上面有一个名为 TextBox1 的文本框。这安全吗?
Dim Timer As MyTimer
Timer = New MyTimer(1000, True, Sub()
                                   If TextBox1.Text <> String.Empty Then
                                      MsgBox("TextBox1 is no longer empty")
                                      Timer.Stop()
                                   End If
                                End Sub)

(因此,Timer 每隔一秒检查 TextBox1 是否为空。如果不是,则显示一个消息框并停止检查。)

我收到一条警告,指出在为 Timer 分配值之前已使用它,但在分配其值的语句中使用了它。定时器的间隔需要大于零。有什么我不明白的可能会导致问题的吗?

谢谢您的帮助!

最佳答案

问题是您正在使用 Timer在传递给 MyTimer 的 lambda 中构造函数。当它编译这一行时:

Timer = New MyTimer(1000, True, Sub()
                                   If TextBox1.Text <> String.Empty Then
                                      MsgBox("TextBox1 is no longer empty")
                                      Timer.Stop()
                                   End If
                                End Sub)
Timer您传入的实例可以被 MyTimer 使用构造函数(编译器不知道)。如果是这种情况,并且因为构造函数在将结果分配给 Timer 之前运行,您正在传递一个未初始化的值并收到警告。

你可以很容易地修复它:
Dim Timer As MyTimer = Nothing
Timer = New MyTimer(1000, True, Sub()
                                   If TextBox1.Text <> String.Empty Then
                                      MsgBox("TextBox1 is no longer empty")
                                      Timer.Stop()
                                   End If
                                End Sub)

也就是说,首先将其显式设置为“无”。我认为这会奏效,但实际上,即使这样也给我敲响了警钟。我会修改 API 以便不需要您将计时器的实例传递给回调,而只需更改它,以便您的回调返回 truefalse至于要不要继续。这样,MyTimer本身可以负责在定时器返回时停止 false .

关于VB.NET 在自己的 "New"语句中的 lambda 表达式中使用自定义计时器 - 可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3835762/

相关文章:

java - 定时器类中潜在的竞争条件?

.net - VB.NET程序试用版的制作

vb.net - 在 VB.Net 中比较 Single 和 Double

c# - 关于GAC中DLL安装的问题

Java 8 lambda null 检查用法

lambda - 使用具有自定义条件的 java8 流从另一个对象创建对象列表

iOS9 Objective-C 使用定时器在后台运行 GPS

VB.NET/COM 服务器代码方式比 Excel VBA 代码慢

java - 结合对象的 ArrayList 并在 Java 中对 BigDecimal 求和

timer - mIRC 在 X 行聊天后执行命令