¿Cómo simplemente monitorear.Introduzca?
-
05-07-2019 - |
Pregunta
Estoy tratando de simplificar las cosas. Aquí está mi código:
If Threading.Monitor.TryEnter(syncRoot) Then
Try
'do something
Finally
Threading.Monitor.Exit(syncRoot)
End Try
Else
'do something else
End If
Esto es incluso peor que el ReaderWriterLock en términos de ruido. Puedo usar C # o VB, por lo que las respuestas que se apliquen a cualquiera de ellas serán bienvenidas.
Solución
¿Usar un delegado?
Por ejemplo
public bool TryEnter(object lockObject, Action work)
{
if (Monitor.TryEnter(lockObject))
{
try
{
work();
}
finally
{
Monitor.Exit(lockObject);
}
return true;
}
return false;
}
Otros consejos
Esto es muy similar a su última publicación , y esperaría una respuesta similar. La única diferencia significativa es que puede devolver " null " de su método si el tiempo de espera falla, entonces el " Dispose () " no se llama, y ??puede verificar fácilmente el valor:
using(var token = GetLock(syncLock, timeout)) {
if(token != null) { ... }
}
El único problema real es que no necesariamente desea agregar un método de extensión a "objeto" (o incluso " T donde T: class ") ...
Jon Skeet ha mirado esto en el pasado - vale la pena echar un vistazo .