【发布时间】:2020-02-21 09:55:42
【问题描述】:
我有一个 VB.NET Windows 服务,它实现了一个每分钟触发的计时器。 这个计时器调用一个方法,Execute。此方法创建类 MyClass 的实例,然后调用该类的方法 DoWork。在 DoWork 方法中,我检查 myStaticList 列表是否存在。如果静态列表不存在(未初始化:什么都没有),那么我创建静态列表并存储一些参数。如果存在静态列表,那么我会读取上面的值来做一些工作。我需要在 MyClass 的新实例之间保留 myStaticList 列表。我该怎么做?下面是代码sn-p。
Public Class MyService
Protected Overrides Sub OnStart(ByVal args() As String)
Dim serviceTimer As New Timer
serviceTimer.Interval = 60000
AddHandler serviceTimer.Elapsed, AddressOf OnTimedEvent
serviceTimer.Enabled = True
End Sub
Private Sub OnTimedEvent(ByVal source As Object, ByVal e As ElapsedEventArgs)
Dim serviceTimer As Timer = source
Try
serviceTimer.Stop()
Me.Execute()
Catch ex As Exception
' Do something...
Finally
serviceTimer.Start()
End Try
End Sub
Private Sub Execute()
Dim p As New MyClass()
p.DoWork()
End Sub
End Class
Public Class MyClass
Static myStaticList As List(Of MyAnotherClass)
Public Sub DoWork()
' Do the work
If IsNothing(myStaticList) Then
' Create and do something with myStaticList, store values, etc.
Else
' Do something with my existing myStaticList, read values and do something
End If
End Sub
End Class
【问题讨论】:
-
Shared是将对象与类关联的关键字,而不是特定实例。鉴于您正在使用共享的可变状态,您将需要格外小心以确保您的工作流受到锁的适当保护(您需要确保除了构建列表的代码之外没有任何东西可以看到部分填充的列表,并且您需要确保不要尝试同时在两个地方构建列表)。Lazy可能对此有所帮助,它有一些锁定基础设施。 -
另外,不要使用 IsNothing,这是 VB 的 VBA 版本中长期过时的兼容性功能(用于检查可能包含对象的
Variants)。使用Is和IsNot运算符,例如If myStaticList Is Nothing或If myStaticList IsNot Nothing.