E 'sicuro usare ReaderWriterLockSlim in un metodo asincrono
Sì e no. Può essere sicuro utilizzarlo in un metodo asincrono, ma probabilmente non è sicuro utilizzarlo in un metodo asincrono in cui si entra e si esce dal blocco che si estende su uno await
.
In questo caso, no, questo non è necessariamente sicuro.
ExitWriteLock deve essere chiamato dallo stesso thread che ha chiamato EnterWriteLock
. Altrimenti getta un SynchronizationLockException
. Da documentation, questa eccezione viene generata quando:
Il thread corrente non è entrato nel blocco in modalità di scrittura.
L'unica volta che questo sarebbe stato sicuro è che se questo è stato utilizzato in un metodo asincrono che era sempre in un ambiente in cui vi era una corrente SynchronizationContext
in luogo che si sposterà le cose allo stesso thread (es: Windows Form , WPF, ecc.) E non è stato utilizzato da una chiamata asincrona nidificata in cui un "parent" della catena di chiamata ha impostato un'Attività con ConfigureAwait(false)
(il che impedirebbe allo Task
di acquisire il contesto di sincronizzazione). Se ti trovi in quello scenario specifico, sapresti che il thread verrà mantenuto, poiché la chiamata await
ti ricondurrà al contesto di chiamata.
fonte
2013-04-08 15:15:48
Sto leggendo questa domanda e le due risposte, la tua e Stephen Cleary si contraddicono. Non ho capito bene. Capisco perché in WPF, ad esempio, il blocco non è un problema perché è lo stesso thread che ha il blocco in primo luogo, ma Stephen dice, nonostante sia lo stesso thread, ReaderWriterLockSlim è sempre un problema con async, non importa l'ambiente –
@ DonBox Beh, non è "sempre" un problema - può funzionare, ma è pericoloso. Suggerisco anche quello.Come ha accennato, con lo stesso contesto, puoi ancora ottenere problemi di reentrancy che causeranno un deadlock - se sai che la tua routine non verrà mai chiamata> 1 volta in modo entusiastico, dovrebbe funzionare, ma è un grande "se" –