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

时间:2010-10-15 02:48:10

标签: vb.net module properties

一个客户端是否可以在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

首先设置Property,然后在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 个答案:

答案 0 :(得分:2)

VB.Net中的模块在AppDomain内共享。因此,同一AppDomain内的两个客户端将在任何给定模块的同一实例上运行。这意味着如果在同一AppDomain

中并行运行,可以很容易地看到另一个写入模块的结果。

在许多方面,最好将存储在模块中的数据视为全局数据(它不是真正的全局数据,但对许多样本来说都是这样的)。

答案 1 :(得分:1)

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

现在,如果可能的话,你建议它“惊人”,所以我假设你想确保这不会发生?换句话说,您希望确保在GetSetDateTime执行期间WhateverMethod的值保持不变。

听起来WhateverMethod仅由“客户端1”运行,而更改GetSetDateTime属性的“客户端2”代码独立于WhateverMethod。这听起来不像SyncLock会有所帮助。

如果两个客户都可以随时更改GetSetDateTime,那么您需要像这样修改WhateverMethod

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

这有帮助吗?