这有效,我无法想象它会如何导致问题,但 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 以便不需要您将计时器的实例传递给回调,而只需更改它,以便您的回调返回
true
或 false
至于要不要继续。这样,MyTimer
本身可以负责在定时器返回时停止 false
.
关于VB.NET 在自己的 "New"语句中的 lambda 表达式中使用自定义计时器 - 可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3835762/