El problema está en la forma en la que estás percibiendo las cosas.
Cuando llamas a la función
ShowDialog, el flujo de control pasa a ese diálogo y el form propietario queda en inactividad hasta que se devuelva una respuesta por parte del diálogo que mostraste.
O dicho de otra forma, un diálogo exige al usuario completar y cerrar manualmente dicho dialogo, ya sea pulsando el botón de cerrar "X" o pulsando algún botón que lo haga cerrarse
, antes de poder continuar con la ejecución de la ventana propietaria.
En el código que has mostrado, esto que he explicado se resume en algo tan simple como que...:
frm.ShowDialog(this);
frm.Dispose();
...la orden
frm.Dispose() nunca se va a procesar hasta que el diálogo no se haya cerrado (o dicho de otra forma, hasta que devuelvas un resultado de diálogo), ya que la función
frm.ShowDialog() es bloqueante.
Te sugiero que añadas un
Timer en la Class del Form del diálogo para cerrarlo de forma automatizada pasado un intervalo de tiempo que tu creas conveniente para terminar de mostrar la imagen. ¿lo entendiste?.
Saludos!