任何可能导致System.Timers.Timer.set_Enabled属性引发System.NullReferenc

本文关键字:System 属性 Enabled NullReferenc Timer Timers 任何可 set | 更新日期: 2023-09-27 18:30:04

这是堆栈跟踪:

2012-03-16 19:15:09Z E System.NullReferenceException:对象引用未设置为对象的实例
在System.Timers.Timer.set_Enabled(布尔值)
在System.Timers.Timer.Stop()

这是代码:

计时器声明为私有成员变量。

Private _myTimer As System.Timers.Timer

初始化计时器方法。

Private Sub InitializeMyTimer()
    _myTimer = New System.Timers.Timer
    _myTimer.Interval = My.Settings.TimeoutSeconds * 1000
    _myTimer.Start()
    AddHandler _myTimer.Elapsed, AddressOf MyTimer_Elapsed
End Sub

计时器运行时间方法。WsMethodAsync调用.asmx web服务方法。

Private Sub MyTimer_Elapsed(ByVal sender As Object, ByVal e As     System.Timers.ElapsedEventArgs)
    Try
        _myTimer.Stop()
        Using thisWSHelper As New WSHelper
            thisWsHelp.WsMethodAsync()
        End Using
        _myTimer.Start()
    Catch ex As Exception
      LogAndShowException(ex)
    End Try
End Sub

计时器必须有一个值,否则timer.Stop()调用将引发异常。这是一个偶然的错误,我只是想看看是否有人以前经历过这种情况,或者是否有人知道可能是什么原因造成的。它发生在WinForms应用程序中的Timer的Elapsed事件处理程序中,但它只在用户计算机上偶尔发生。我自己还没能重现这个错误。

任何可能导致System.Timers.Timer.set_Enabled属性引发System.NullReferenc

好吧,让我们假设您意识到System.Timers.Timer类实现了IDisposable,并且您编写了代码来正确处理计时器,就像您应该的那样:

Private Sub OnDisposed(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Disposed
    If myTimer IsNot Nothing Then
        myTimer.Dispose()
        myTimer = Nothing
    End If
End Sub

是的,这会偶尔流行一次。Elapsed事件由线程池线程引发,可以在任何奇数时间开始运行。如果线程池特别繁忙,可能需要几秒钟的时间。处理计时器并不能阻止事件运行,因为tp线程已经在运行。因此,有了这个特殊的代码,你很可能会得到一个NRE。只是有时候,当你调试代码的时候从来没有。

以可控的方式停止System.Timers.Timer是非常困难的,您永远无法确定Elapsed事件在禁用后不会激发。请进行防御,并记住这是可能的。并支持System.Threading.Timer.

首先,您看到这些随机异常的原因:

System.Timers.Timer使用System.Threading.Timer,正如Hans-Passant所说,每次迭代都在另一个线程上完成。这使得在禁用计时器后可以引发Elapsed事件,因为在上一次迭代完成之前可以启动新的迭代。

System.Timers.Timer的工作方式,禁用它将处理底层System.Threading.Timer并将其设置为Nothing。在一种罕见的(这个词是多余的吗?)竞争条件下,当计时器设置为Nothing时,您的计时器将尝试在其基础计时器上运行Dispose,从而产生NullReferenceException


一种解决方案是将Timer.AutoReset属性设置为False,然后在Elapsed事件中重新启动计时器。

相关文章: