[ Belgarion @ 26.04.2012. 14:50 ] @
Problem:
Treba da napišem funkciju koja vraća listu jezika određenog usera.
Lista jezika se čuva u dictionary-ju a key je ClientID usera.

Cilj je da se ne čita iz baze ako statički dictionary ima vrednost za odgovarajući ClientID.
Dakle čitanje iz baze ide samo ako mora.

GetLanguages(userData) je funkcija koja čita iz baze.

Uvek treba biti pažljiv kod sinhronizacije thread-ova kada se radi sa statičkim vrednostima na web stranici.
A testiranje je jako problematično.

Nekako mi je logičnije da SyncLock bude unutar If - a ali to ima svojih problema.

Da li je ovo dobro rešenje?


Code:
 Private Shared dictionary As New Dictionary(Of Integer, List(Of Language))



    Public Shared Function GetListOfLanguages(ByVal userData As IUser) As List(Of Language)

        If Not userData Is Nothing Then

            SyncLock dictionary
                If Not dictionary.ContainsKey(userData.ClientID) Then
                    dictionary.Add(userData.ClientID, GetLanguages(userData))
                End If
            End SyncLock

            Return dictionary.Item(userData.ClientID)

        End If

        Return Nothing
    End Function
[ ravni @ 26.04.2012. 23:35 ] @
Mislim da uopste ne moras da komplikujes i da ti je dovoljno
Code:
If Not dictionary.ContainsKey(userData.ClientID) Then
  dictionary(userData.ClientID) = GetLanguages(userData)
End If
umesto
Code:
SyncLock dictionary
   If Not dictionary.ContainsKey(userData.ClientID) Then
     dictionary.Add(userData.ClientID, GetLanguages(userData))
   End If
End SyncLock
[ vujkev @ 27.04.2012. 00:39 ] @
Ukoliko dva procesa u istom trenutku provere da li određeni ključ postoji, oba će dobiti da ne postoji i oba će pokušati da isti dodaju. Prilikom drugog dodavanja puca program jer kljiuč postoji (dodao ga je prethodni proces). SyncLock je obavezan i mislim da ne može drugačije od onoga što je Belgarion napisao. Ako synclock staviš u okviru IF petlje dolaziš opet u situaciju opisanu u prvoj rečenici
[ Dejan Carić @ 27.04.2012. 08:00 ] @
U .NET 4 postoji klasa ConcurrentDictionary
[ ravni @ 27.04.2012. 10:28 ] @
Citat:
vujkev:Prilikom drugog dodavanja puca program jer kljiuč postoji (dodao ga je prethodni proces).
Resenje koje sam dao
Code:
dictionary(userData.ClientID) = GetLanguages(userData)
ne puca u tom scenariju.
Iz dokumentacije:
Citat:
When you set the property value, if the key is in the Dictionary<TKey, TValue>, the value associated with that key is replaced by the assigned value. If the key is not in the Dictionary<TKey, TValue>, the key and value are added to the dictionary.