VB模块中的公共属性 - 跨客户端行为

4

一个客户端能否调用VB.NET模块中的公共属性,并看到另一个客户端在同时访问时更改该公共属性的值?

示例:

客户端1进行调用

Public Module DataModule
    Private theDateTime As DateTime = GetAdjustedDateTime() //initial TZ value

    Public Property GetSetDateTime() As DateTime
        Get
            Return theDateTime
        End Get
        Set(ByVal value As String)
            theDateTime = value
        End Set
    End Property
End Module

通过首先设置属性,然后在整个WhateverMethod()中获取该值...
Partial Class admintours
    Inherits System.Web.UI.Page

    Private Sub WhateverMethod()
            GetSetDateTime = Now
            ...
            ...
            ... //code
            ...
            SomeFunction(GetSetDateTime) //value is 10/14/2010 00:23:56
            ...    
            ...
            //almost simultaneously Client 2 sets the value to Now.AddDays(-1) 
            ...
            SomeOtherFunc(GetSetDateTime) //value passed in: 10/13/2010 00:23:56
            ...
            ...
            ... //some more code
            ...
    End Sub
End Class

我遇到了一些随机情况,看起来另一个客户端可能正在修改(通过设置)GetSetDateTime的值,在第一个客户端运行WhateverMethod()期间。这让我感到不安,我一直在试图弄清楚是否有可能发生这种情况。如果能够确认或否认这一点将会很有帮助,谢谢!

2个回答

2
在VB.Net中,模块在一个AppDomain内是共享的。因此,在同一AppDomain内的两个客户端将操作任何给定模块的相同实例。这意味着,如果它们在同一个AppDomain内并行运行,一个客户端可以轻松地看到另一个客户端写入模块的结果。
在许多方面,最好将存储在模块中的数据视为全局数据(虽然它并非真正的全局数据,但对于许多示例来说,它表现出类似的行为)。

1

是的,如果您所说的“客户端”是指单个应用程序中的单独线程(还假设单个CPU进程和单个AppDomain)。

现在,您建议如果这是可能的话,这是“令人担忧”的,因此我假设您想确保这不会发生?换句话说,在执行WhateverMethod期间,您希望确保GetSetDateTime的值保持不变。

听起来WhateverMethod只由“客户端1”运行,并且更改GetSetDateTime属性的“客户端2”代码与WhateverMethod无关。看起来SyncLock在这里没有帮助。

如果两个客户端都能随时更改GetSetDateTime,那么您需要修改WhateverMethod如下:

Private Sub WhateverMethod()
        Dim localNow = Now
        GetSetDateTime = localNow
        ...
        SomeFunction(localNow)
        ...    
        SomeOtherFunc(localNow)
        ...
End Sub

这有帮助吗?


非常感谢您详细的回复。我已经按照您的建议进行了修改。通过将GetSetDateTime的值存储在仅限于WhateverMethod的本地变量localNow中,我希望在该方法执行过程中避免任何意外修改该值。至今我还没有部署和测试过,不知道是否会浪费时间,真正的问题可能存在于其他地方;因此我才发布了这篇帖子。客户端2也可以运行WhateverMethod,并设置自己的时区信息,所以SyncLock可能有帮助。我对此不太熟悉... - afilbert
PS,我试图给你的答案点赞,但我猜我没有足够的“声望”。 - afilbert
@afilbert - 你只需要15点声望就可以点赞了,但是你已经有10点了,只需要再5点。等你拥有它们时再回来吧。 :-) - Enigmativity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接