VB.NET在lambda表达式中使用自定义计时器;新";声明-可以吗?
这是可行的,我无法想象它会如何引起问题,但VisualStudio给了我一个警告,这让我很难过。我只是想知道这样做是否会引起问题: 我有一个自定义计时器,它的作用类似于等待若干毫秒,然后执行一个函数。看起来是这样的: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
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子对象