Nello script precedente sull'argomento (#612) abbiamo visto come effettuare il lock delle risorse per evitare che accessi contemporanei possano "corrempere" il contenuto della stessa.
Uno degli svantaggi di tale tecnica è che essa preclude sia gli accessi in lettura che quelli in scrittura, senza distinzione.
Questo potrebbe portare ad un decadimento delle prestazioni inutile.
Ipotizziamo di avere ancora il classico contatore che viene utilizzato per contare, in questo caso, quante volte si è cliccato su un link, ed è allo stesso tempo utilizzato per visualizzare quante volte questo link è stato visitato.
Nel 99% dell'utilizzo di questa risorsa ci limiteremo solo a leggere il contenuto di tale file, e solo l'1% ad aggiornarlo, ed è proprio questo uno di quei casi in cui il lock completo della risorsa è antiproducente.
Come possiamo risolvere? Per fortuna è stata creata una classe di nome "ReaderWriterLock", che ci permette di fare in modo che una risorsa possa essere letta contemporanemaneto da qualsiasi utente, ma nel momento della modifica un solo utente possa accedervi.
Vediamo la struttura di una classe con due funzioni, la prima per la lettura della risorsa, e l'altra per la scrittura e aggiugiamo l'utilizzo di questa classe per il lock:
public class Test
Private Shared rwl As New ReaderWriterLock()
Public Shared Function Leggi()
rw1.AcquireReaderLock()
' Codice per lettura della risorsa
rw1.ReleaseReaderLock()
End Function
Public Shared Function Aggiorna()
rw1.AcquireWriterLock()
' Codice per la modifica della risorsa
rw1.ReleaseWriterLock()
End Function
end classSi deve fare attenzione all'uso di queste funzioni per il lock. Nel caso ci fosse qualche problema con l'accesso della risorsa e venisse generata un'eccezione, il lock non sarebbe rilasciato e questo bloccherebbe l'accesso per il resto della vita dell'applicazione a quel processo.
In tal caso è buona regola l'utilizzo del try...finally:
Public Shared Function Leggi()
try
rw1.AcquireReaderLock()
' Codice per lettura della risorsa
finally
rw1.ReleaseReaderLock()
end try
end functionApprofondimenti
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemThreadingReaderWriterLockClassReleaseWriterLockTopic.asp#612 - Utilizzare il lock di oggetti con il .NET Framework
https://www.aspitalia.com/liste/usag/script.aspx?ID=612
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Accedere a risorse e immagini in Windows Store app di Windows 8
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Permettere il Drag-and-drop solo su zone predefinite con Silverlight 2.0
- Consumare dati binari in realtime lato client con ASP.NET Core SignalR
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Personalizare l'icona e le funzionalità di un sito web per iOS e IE
- Caricamenti veloci da CDN e fallback locale con ASP.NET Core
- Utilizzare dati in formato XML in XAML
- Accedere a dati esposti con WebService con Silverlight 1.0


