gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:53:50 25 4
gpt4 key购买 nike

这有效,我无法想象它会如何导致问题,但 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com