Come vorresti semplicemente Monitor. TryEnter
-
05-07-2019 - |
Domanda
Sto cercando di semplificare le cose. Ecco il mio codice:
If Threading.Monitor.TryEnter(syncRoot) Then
Try
'do something
Finally
Threading.Monitor.Exit(syncRoot)
End Try
Else
'do something else
End If
Questo è anche peggio di ReaderWriterLock in termini di rumore. Posso usare C # o VB, quindi le risposte che faranno domanda saranno benvenute.
Soluzione
Usa un delegato?
per es.
public bool TryEnter(object lockObject, Action work)
{
if (Monitor.TryEnter(lockObject))
{
try
{
work();
}
finally
{
Monitor.Exit(lockObject);
}
return true;
}
return false;
}
Altri suggerimenti
Questo è molto simile al tuo ultimo post e mi aspetterei una risposta simile. L'unica differenza significativa è che potresti restituire " null " dal tuo metodo se il timeout fallisce, quindi il " Dispose () " non viene chiamato e puoi facilmente verificare il valore:
using(var token = GetLock(syncLock, timeout)) {
if(token != null) { ... }
}
L'unico vero problema è che non devi necessariamente aggiungere un metodo di estensione a " oggetto " (o anche " T dove T: class ") ...
Jon Skeet ha esaminato questo aspetto in passato - vale la pena dare un'occhiata .