This works, and I can’t imagine how it might cause problems, but visual studio gives me an warning and that makes me sad. I’m just wondering if doing something like this might ever cause problems:
I have a custom timer that acts like a Wait for some number of milliseconds and then execute a function. It looks like this:
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
I use it like this:
Dim Timer as New MyTimer(1000, False, Sub()
..code..
End Sub)
or
Dim Timer as New MyTimer(1000, True, Sub()
..code..
End Sub)
The first case waits one seconds and then executes ..code.., the second case executes ..code.. repeatedly every one second.
Now the question: Imagine I have a form with a textbox called TextBox1 on it. Is this safe?
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)
(So, every one second, Timer checks if TextBox1 is empty. If it isn’t, it displays a message box and stops checking.)
I get a warning that Timer is used before it has been assigned a value, but it is used in the statement that assigns its value. The timer’s interval is required to be greater than zero. Is there anything about this that I don’t understand that could cause problems?
Thanks for the help!
The problem is that you’re using
Timerin a lambda that you pass to theMyTimerconstructor. When it compiles this line:The
Timerinstance that you pass in could be used by theMyTimerconstructor (the compiler doesn’t know). If that’s the case, and because the constructor runs before the result is assigned toTimer, you’re passing an uninitialized value and you get the warning.You can fix it quite easily:
That is, explicitly set it to “nothing” first. I think this would work, but in reality, even this is raising alarm bells to me. I would modify the API so that instead of requiring that you pass in an instance of the timer to the callback, you simply change it so that your callback returns either
trueorfalsefor whether it wants to continue or not. That way,MyTimeritself can be responsible for stopping when the timer returnsfalse.