Ni siquiera sé C#, pero en función de mis experiencias con otros lenguajes de programación, supongo: si una aplicación falla, eso significa que hay algo realmente malo en ella. Manejo de memoria incorrecto, etc. Sería extraño que cualquier lenguaje de programación intente ejecutar destructores/desasignadores/finalizadores/... en tal caso. Las cosas serían, probablemente, sólo tiene que ir más equivocado;)
Actualización: (se olvidó de tratar de responder a sus otras preguntas) de nuevo, no específico de C#, pero por lo general no hay garantía de que los destructores/deallocators/finalizadores/... en realidad ser llamado. La razón de esto es que cuando un proceso se cierra, es mucho más fácil y eficiente simplemente "zap" el bloque de memoria utilizado para el proceso que ejecutar sus destructores, etc. para limpiar la memoria.
No estoy seguro de cómo responder a su última pregunta sin entrar en demasiados detalles técnicos. Hay varias maneras en que los recolectores de basura pueden diseñarse y ejecutarse, la más fácil es que la recolección de basura detenga el proceso actual y lo continúe cuando esté terminado, aunque también es posible (aunque más difícil) tener recolectores de basura que se ejecuten simultáneamente. con procesos cuya memoria están recolectando.
Es posible que desee leer sobre la teoría de la recolección de basura para comprender mejor todo esto. De hecho, hay un sitio completo sobre este tema: www.memorymanagement.org.
¿Qué tipo de bloqueo? Las excepciones no son un bloqueo, sino errores recuperables. – Dykam