gpt4 book ai didi

c# - 关于什么可能导致 System.Timers.Timer.set_Enabled 属性抛出 System.NullReferenceException 的任何想法?

转载 作者:行者123 更新时间:2023-11-30 16:25:20 27 4
gpt4 key购买 nike

这是堆栈跟踪:

2012-03-16 19:15:09Z E System.NullReferenceException: Object reference not set to an instance of an object.
at System.Timers.Timer.set_Enabled(Boolean value)
at System.Timers.Timer.Stop()

代码如下:

定时器声明为私有(private)成员变量。

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 类实现了 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。

关于c# - 关于什么可能导致 System.Timers.Timer.set_Enabled 属性抛出 System.NullReferenceException 的任何想法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10014326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com