views:

27

answers:

2

Can one client call a public property within a VB.NET module and see the value of that public property changed by another client accessing it at the same time?

Example:

Client 1 calls

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

by first setting the Property and then getting the value throughout 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

I'm running into random instances where it looks like another client might be modifying (by setting) the value of GetSetDateTime DURING the first client's run through of WhateverMethod(). This is alarming to me and I've been trying to figure out if that's a possibility. Any confirmation or otherwise as to that would be helpful, thanks!

+1  A: 

Modules in VB.Net are shared within an AppDomain. So two clients within the same AppDomain will be operating on the same instance of any given Module. This means one could easily see the results of the other writing to the Module if they are running in parallel in the same AppDomain

In many ways it's best to view the data stored in a Module as global (it's not truly global but behaves that way for many samples).

JaredPar
+1  A: 

Yes, if by "client" you mean separate threads in a single application (also assuming a single CPU process and a single AppDomain).

Now, you suggest that it is "alarming" if this is a possibility, so I assume that you want to make sure that this doesn't happen? In order words, you want to ensure that the value of GetSetDateTime remains unchanged during the execution of WhateverMethod.

It sounds like WhateverMethod is only run by "client 1", and the "client 2" code that changes the GetSetDateTime property is independent of WhateverMethod. It doesn't sound like SyncLock would help here.

If both clients are able to change GetSetDateTime at any time then you need to modify WhateverMethod like so:

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

Does this help?

Enigmativity
Thanks a bunch for your detailed response. I've done just that. By storing the value of GetSetDateTime in a localNow variable local only to WhateverMethod, I was hoping to avoid any unintended modification of the value during execution of that method. I have yet to deploy and test that, and wondered if I might be wasting my time while the real problem lay elsewhere; hence my post. Client 2 can run WhateverMethod too, setting their own TimeZone info, so SyncLock might help. I'm not familiar with it...
afilbert
PS, tried to vote your answer up but I guess I don't have enough "reputation"
afilbert
@`afilbert` - You only need 15 points of reputation to up-vote, but your already have 10, only 5 more need. Come back when you have them. :-)
Enigmativity