Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 要在类的新实例之间持久化的静态列表_.net_Vb.net_Static - Fatal编程技术网

.net 要在类的新实例之间持久化的静态列表

.net 要在类的新实例之间持久化的静态列表,.net,vb.net,static,.net,Vb.net,Static,我有一个VB.NET Windows服务,它实现了一个每分钟触发一次的计时器。 此计时器调用方法Execute。此方法创建类MyClass的实例,然后调用该类的方法DoWork。在DoWork方法中,我检查myStaticList是否存在。如果静态列表不存在(未初始化:nothing),则创建静态列表并存储一些参数。如果静态列表存在,那么我读取它上的值来做一些工作。我需要在MyClass的新实例之间持久化myStaticList列表。我怎么做?下面是代码片段 Public Class MySer

我有一个VB.NET Windows服务,它实现了一个每分钟触发一次的计时器。 此计时器调用方法Execute。此方法创建类MyClass的实例,然后调用该类的方法DoWork。在DoWork方法中,我检查myStaticList是否存在。如果静态列表不存在(未初始化:nothing),则创建静态列表并存储一些参数。如果静态列表存在,那么我读取它上的值来做一些工作。我需要在MyClass的新实例之间持久化myStaticList列表。我怎么做?下面是代码片段

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

一个选项是将
myStaticList
存储为
MyService
的成员,作为私有的非静态成员

它需要将一个填充列表的方法移动到MyService。 它需要在
MyService
中实例化列表,这些列表仍然可以在
MyClass
中进行更改


然后,构造函数可以将该列表传递到
MyClass
实例中,该构造函数将分配一个列表。

一个选项是将
myStaticList
存储为
MyService
的成员,作为私有的非静态成员

它需要将一个填充列表的方法移动到MyService。 它需要在
MyService
中实例化列表,这些列表仍然可以在
MyClass
中进行更改


然后,构造函数可以将该列表传递到
MyClass
实例中,该构造函数将分配一个列表。

另一个选项是使myStaticList不是“静态”而是“共享”:

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


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

另一个选项是使myStaticList不是“静态”而是“共享”:

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


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

shared
是将对象与类(而不是特定实例)关联的关键字。考虑到您使用的是共享可变状态,您需要非常小心地确保您的工作流受到适当的锁保护(您需要确保,除了构造列表的代码之外,没有任何东西可以看到部分填充的列表,并且您需要确保不要尝试同时在两个位置构造列表).
Lazy
可能有帮助,它有一些锁定基础设施。另外,不要使用IsNothing,这是VB的VBA版本中的一个过时的兼容性函数(用于检查可能包含对象的
Variant
s)。使用
Is
IsNot
运算符,例如,如果myStaticList为Nothing,则使用
;如果myStaticList为Nothing,则使用
如果myStaticList为Nothing,则使用
共享
是将对象与类(而非特定实例)关联的关键字。您需要格外小心,以确保您的工作流是正确的由于您使用的是共享的可变状态,因此最近受到锁的保护(您需要确保除了构造列表的代码之外,没有任何东西可以看到部分填充的列表,并且您需要确保不尝试同时在两个位置构造列表).
Lazy
可能有帮助,它有一些锁定基础设施。另外,不要使用IsNothing,这是VB的VBA版本中的一个过时的兼容性函数(用于检查可能包含对象的
Variant
s)。使用
Is
IsNot
运算符,例如,如果myStaticList为Nothing,则使用
;如果myStaticList为Nothing,则使用
Private Shared myStaticList As List(Of MyAnotherClass)