Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Ispravno koriscenje SyncLock (VB).

[es] :: .NET :: Ispravno koriscenje SyncLock (VB).

[ Pregleda: 1950 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Belgarion
Novi Sad

Član broj: 245135
Poruke: 71
*.static.sbb.rs.



+2 Profil

icon Ispravno koriscenje SyncLock (VB).26.04.2012. u 14:50 - pre 146 meseci
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
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: Ispravno koriscenje SyncLock (VB).26.04.2012. u 23:35 - pre 146 meseci
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
 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1347
212.200.243.*



+104 Profil

icon Re: Ispravno koriscenje SyncLock (VB).27.04.2012. u 00:39 - pre 146 meseci
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
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
82.117.199.*

Sajt: www.dcaric.com


+26 Profil

icon Re: Ispravno koriscenje SyncLock (VB).27.04.2012. u 08:00 - pre 146 meseci
U .NET 4 postoji klasa ConcurrentDictionary
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: Ispravno koriscenje SyncLock (VB).27.04.2012. u 10:28 - pre 146 meseci
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.
 
Odgovor na temu

[es] :: .NET :: Ispravno koriscenje SyncLock (VB).

[ Pregleda: 1950 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.