我在Windows窗体中使用System.Threading.Timer。它在表单上声明为私有,但计时器是从2个位置初始化的,这些位置是FrmMain_Load()和ToolClick()。
FrmMain_Load在第一次启动应用程序时运行,但我需要在ToolClick()上重置计时器并再次启动计时器。 所以我试图从ToolClick()调用InitializeTimer()。这是停止和重置计时器的正确方法吗?此外,它是否必须处理 关闭表格时明确表示?感谢您的任何建议。
Private timer As System.Threading.Timer
Private Sub FrmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
//Other code
InitializeTimer()
End Sub
Private Sub ToolClick(ByVal sender As System.Object, ByVal e As Infragistics.Win.UltraWinToolbars.ToolClickEventArgs) Handles u.ToolClick
//Other code
InitializeTimer()
End Sub
Private Sub InitializeTimer()
If Items.Visible Then
Dim refreshCallBack As New System.Threading.TimerCallback(AddressOf timer_Tick)
timer = New System.Threading.Timer(refreshCallBack, Nothing, 0, 60000)
End If
End Sub
Private Sub timer_Tick(ByVal state As Object)
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(Sub()
Refresh()
End Sub))
Else
Refresh()
End If
End Sub
答案 0 :(得分:2)
根据经验,任何实现IDisposable接口的东西必须在不再需要时处理,即使表格即将关闭。
考虑到表单的关闭当前意味着应用程序正在终止,但这个事实很快就会改变。
请注意,IDisposable实现可以包装非托管资源,如果包装类型实现不当,则不会处理它可能会导致各种问题。
在您的情况下,在表单关闭时不处理计时器将无效,但请考虑:
如果您不处理任何IDisposable,会发生什么?这取决于类型,以及实施者。
最佳情况 - 您泄漏资源,直到它以某种方式收集垃圾。请注意,仅在受管资源的情况下才会这样。
最糟糕的情况是,非托管资源包装器通常就是这种情况 - 资源泄漏,OutOfMemoryException甚至是导致应用程序崩溃的非托管异常。
因此,要强调简短的回答 - 就IDisposable而言,养成“遵循协议”的习惯。
随时在评论中提出进一步的问题。