Observo que nadie ha mencionado en sus respuestas a esta pregunta anterior que liberando un bloqueo ante una excepción es algo increíblemente peligroso de hacer. Sí, las sentencias de bloqueo en C# tienen semántica "finalmente"; cuando el control sale de la cerradura normal o anormalmente, se libera la cerradura. Todos hablan de esto como si fuera algo bueno, ¡pero es algo malo! Lo correcto si tiene una región bloqueada que arroja una excepción no controlada es finalizar el proceso enfermo inmediatamente antes de que destruya más datos de usuario, no libere el bloqueo y continúe.
Mírelo de esta manera: supongamos que tiene un baño con un candado en la puerta y una fila de personas esperando afuera. Una bomba en el baño se apaga, matando a la persona que está allí. Su pregunta es "¿en esa situación se desbloqueará automáticamente la cerradura para que la siguiente persona pueda entrar al baño?" Sí, lo hará. Eso no es algo bueno. ¡Una bomba estalló y mató a alguien! La tubería probablemente se destruyó, la casa ya no es estructuralmente sólida y podría haber otra bomba allí. Lo correcto es sacar a todos lo más rápido posible y demoler toda la casa.
Quiero decir, creo que a través: si usted se trabó una región de código con el fin de leer de una estructura de datos sin que se mutó en otro hilo, y algo en esa estructura de datos inició una excepción, más probable es que es porque la estructura de datos está corrupta. Los datos del usuario ahora están en mal estado; no desea intente guardar datos de usuario en este punto porque está guardando datos corruptos. Solo termine el proceso.
Si bloqueó una región de código para realizar una mutación sin otro hilo leyendo el estado al mismo tiempo, y la mutación arroja, entonces si los datos no estaban corruptos antes, ahora es. ¿Cuál es exactamente el escenario que se supone que el bloqueo protege contra. Ahora el código que está esperando para leer ese estado se inmediatamente se le dará acceso al estado dañado, y probablemente se bloquee. Nuevamente, lo correcto es terminar el proceso.
No importa cómo lo cortes, una excepción dentro de un bloqueo es malas noticias. La pregunta correcta es "¿se limpiará mi cerradura en caso de una excepción?" La pregunta correcta es "¿cómo me aseguro de que nunca haya una excepción dentro de un candado? Y si lo hay, ¿cómo estructuraré mi programa para que las mutaciones vuelvan a los buenos estados previos?"
Como reflexión final (ver actualizaciones) - probablemente solo deberías mantener el bloqueo mientras dure la secuencia ... haz el procesamiento ** fuera ** de la cerradura. –
Código después de la captura se ejecuta porque se maneja la excepción – cjk
Gracias, debo haber perdido esa, ¿debería eliminar esta pregunta? – Vort3x