Application.Lock ifm. online brugere uden global.asa
Jeg har et par spørgsmål/brug for et råd.Jeg vil bruge nedenstående kode (hentet fra http://www.aspfree.com/c/a/ASP-Code/Active-User-Count-Without-Globalasa-by-Josh-Painter/) til at tælle antal online brugere, for at undgå at bruge global.asa. Koden skal indsættes som en include i starten af alle mine sider.
'--- Start på kode ---
<%
Sub LogActiveUser
Dim strActiveUserList
Dim intUserStart, intUserEnd
Dim strUser
Dim strDate
strActiveUserList = Application("ActiveUserList")
If Instr(1, strActiveUserList, Session.SessionID) > 0 Then
Application.Lock
intUserStart = Instr(1, strActiveUserList, Session.SessionID)
intUserEnd = Instr(intUserStart, strActiveUserList, "|")
strUser = Mid(strActiveUserList, intUserStart, intUserEnd - intUserStart)
strActiveUserList = Replace(strActiveUserList, strUser, Session.SessionID & ":" & Now())
Application("ActiveUserList") = strActiveUserList
Application.UnLock
Else
Application.Lock
Application("ActiveUsers") = CInt(Application("ActiveUsers")) + 1
Application("ActiveUserList") = Application("ActiveUserList") & Session.SessionID & ":" & Now() & "|"
Application.UnLock
End If
End Sub
Sub ActiveUserCleanup
Dim ix
Dim intUsers
Dim strActiveUserList
Dim aActiveUsers
Dim intActiveUserCleanupTime
Dim intActiveUserTimeout
intActiveUserCleanupTime = 1 'In minutes, how often should the ActiveUserList be cleaned up.
intActiveUserTimeout = 20 'In minutes, how long before a User is considered Inactive and is deleted from ActiveUserList
If Application("ActiveUserList") = "" Then Exit Sub
If DateDiff("n", Application("ActiveUsersLastCleanup"), Now()) > intActiveUserCleanupTime Then
Application.Lock
Application("ActiveUsersLastCleanup") = Now()
Application.Unlock
intUsers = 0
strActiveUserList = Application("ActiveUserList")
strActiveUserList = Left(strActiveUserList, Len(strActiveUserList) - 1)
aActiveUsers = Split(strActiveUserList, "|")
For ix = 0 To UBound(aActiveUsers)
If DateDiff("n", Mid(aActiveUsers(ix), Instr(1, aActiveUsers(ix), ":") + 1, Len(aActiveUsers(ix))), Now()) > intActiveUserTimeout Then
aActiveUsers(ix) = "XXXX"
Else
intUsers = intUsers + 1
End If
Next
strActiveUserList = Join(aActiveUsers, "|") & "|"
strActiveUserList = Replace(strActiveUserList, "XXXX|", "")
Application.Lock
Application("ActiveUserList") = strActiveUserList
Application("ActiveUsers") = intUsers
Application.UnLock
End If
End Sub
Call LogActiveUser()
Call ActiveUserCleanup()
Response.Write "There are " & Application("ActiveUsers") & " active users currently online."
%>
'--- Slut på kode ---
Mit spørgsmål er: Er det ikke bedst at låse Application objektet med Application.Lock mens hele sub'en afvikles, og altså ikke kun i dele af den, som i ovenstående kode?
Eksempel:
I sub'en "ActiveUserCleanup" indlæses Application-variablen "ActiveUserList" ind i den lokale variabel "strActiveUserList". Der ryddes op i den lokale variabel og denne læses tilbage i Application-variablen.
Burde Application ikke låses under hele denne proces? Mens der ryddes i den lokale variabel (hos bruger A), kunne en anden bruger (bruger B) jo køre scriptet og tilføje noget til Application-variabelen. Når så bruger A indlæser sin lokale variabel i Application-variablen, så mistet den information som bruger B lige har tilføjet.
Har jeg ret? Vil det ikke være mest sikkert at låse Application-objektet under hele sub'en? Jeg spørger fordi jeg er meget i tvivl om dette.
Vil det sløve et site meget og give lange ventetider at låse Application objektet mens en hel sub køres?