【问题标题】:Static list to be persisted between new instances of a class要在类的新实例之间持久化的静态列表
【发布时间】: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)。使用 IsIsNot 运算符,例如If myStaticList Is NothingIf myStaticList IsNot Nothing.

标签: .net vb.net static


【解决方案1】:

一种选择是将myStaticList 作为MyService 的成员存储为私有的非静态成员。

这将需要将一个填充列表的方法移动到 MyService。 它将需要在 MyService 中实例化列表,并且这些列表仍可用于 MyClass 中的更改。

然后这个列表可以通过构造函数传递给MyClass实例,该构造函数将分配一个列表。

【讨论】:

    【解决方案2】:

    另一种选择是使 myStaticList 不是“静态”而是“共享”:

    Private Shared myStaticList As List(Of MyAnotherClass)
    

    实际上它可能不应该被称为 myStaticList 而应该是 mySharedList ;)

    该列表将在 MyClass 的所有实例之间共享,并在 MyClass 实例死亡后保留。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多