System.Threading.Timer是否必须在使用后以编程方式处理?

时间:2017-03-27 19:13:01

标签: .net vb.net

我在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

1 个答案:

答案 0 :(得分:2)

根据经验,任何实现IDisposable接口的东西必须在不再需要时处理,即使表格即将关闭。

考虑到表单的关闭当前意味着应用程序正在终止,但这个事实很快就会改变。

请注意,IDisposable实现可以包装非托管资源,如果包装类型实现不当,则不会处理它可能会导致各种问题。

在您的情况下,在表单关闭时不处理计时器将无效,但请考虑:

如果您不处理任何IDisposable,会发生什么?这取决于类型,以及实施者。

最佳情况 - 您泄漏资源,直到它以某种方式收集垃圾。请注意,仅在受管资源的情况下才会这样。

最糟糕的情况是,非托管资源包装器通常就是这种情况 - 资源泄漏,OutOfMemoryException甚至是导致应用程序崩溃的非托管异常。

因此,要强调简短的回答 - 就IDisposable而言,养成“遵循协议”的习惯。

随时在评论中提出进一步的问题。