VB.NET在lambda表达式中使用自定义计时器;新";声明-可以吗?

VB.NET在lambda表达式中使用自定义计时器;新";声明-可以吗?,vb.net,lambda,timer,compiler-warnings,variable-assignment,Vb.net,Lambda,Timer,Compiler Warnings,Variable Assignment,这是可行的,我无法想象它会如何引起问题,但VisualStudio给了我一个警告,这让我很难过。我只是想知道这样做是否会引起问题: 我有一个自定义计时器,它的作用类似于等待若干毫秒,然后执行一个函数。看起来是这样的: Public Class MyTimer Inherits Timers.Timer Public Event Done() Public Sub New(ByVal interval As Double, ByVal repeat As Boolean

这是可行的,我无法想象它会如何引起问题,但VisualStudio给了我一个警告,这让我很难过。我只是想知道这样做是否会引起问题:

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

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)
我是这样使用它的:

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)

第一个案例等待一秒钟,然后执行..代码..,第二个案例执行..代码。。每秒钟重复一次

现在的问题是:假设我有一个表单,上面有一个名为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)
将计时器变暗为MyTimer
计时器=新的MyTimer(1000,真,Sub()
如果TextBox1.Text String.Empty,则
MsgBox(“TextBox1不再为空”)
计时器停止()
如果结束
末端接头)
(因此,每隔一秒钟,计时器就会检查TextBox1是否为空。如果为空,则会显示一个消息框并停止检查。)

我得到一个警告,计时器在被赋值之前就已经被使用了,但是它被用在赋值的语句中。计时器的间隔要求大于零。关于这件事,有什么我不明白的地方会引起问题吗


谢谢你的帮助

你真的应该把它放在using语句中,这样每次定时器都会被处理掉。MyTimer类还应该实现IDisposable。

问题是,在传递给
MyTimer
构造函数的lambda中使用了
Timer
。编译此行时:

Timer = New MyTimer(1000, True, Sub()
                                   If TextBox1.Text <> String.Empty Then
                                      MsgBox("TextBox1 is no longer empty")
                                      Timer.Stop()
                                   End If
                                End Sub)

也就是说,首先显式地将其设置为“nothing”。我认为这会奏效,但事实上,即使这样也给我敲响了警钟。我会修改API,这样就不需要将计时器的实例传递给回调,而只需更改它,以便回调返回
true
false
,判断是否要继续。这样,
MyTimer
本身就可以负责在计时器返回
false

+1时停止:“但是visual studio给了我一个警告,这让我很伤心”哈哈,差不多是这样的嘿,谢谢你的评论。MyTimer继承System.Timers.Timer的事实是否为我做到了这一点?您仍然需要显式调用.Dispose,但是,您可能不需要实现IDisposable,除非MyTimer本身具有一次性元素。Hmmmm。。。我在试着理解你的意思。我知道我可以像Timer=New MyTimer(1000,True,Function()Return TextBox1.Text String.Empty)这样做,但我不知道返回值会去哪里,也不知道如何处理它。据我所知。也许Dean的意思是事件应该有一个ByRef布尔参数作为返回值
Public Event Func(ByRef bOut As Boolean)
然后用布尔参数定义lambda子对象