Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 4 odgovora
  • 2.655 pregleda

Najnovija ↓

Ispravno koriscenje SyncLock (VB). 26.04.2012. u 15:50 · pre 176 meseci #1
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
Re: Ispravno koriscenje SyncLock (VB). 27.04.2012. u 00:35 · pre 176 meseci #2
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
Re: Ispravno koriscenje SyncLock (VB). 27.04.2012. u 01:39 · pre 176 meseci #3
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
Potpis
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
Re: Ispravno koriscenje SyncLock (VB). 27.04.2012. u 11:28 · pre 176 meseci #5
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.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme