Hola
Iba a poner esto como respuesta al artículo de Octavio sobre «Qué problema tiene este código», pero lo pongo en artículo aparte por si le sirve a alguien más. La documentación oficial de Silverlight recomienda, en efecto, usar System.Threading.Thread.Sleep(1) (con un 1 en vez de un 0), cuando queremos suspender el subproceso actual y dar prioridad a otros subprocesos en espera de ejecución. La razón principal no la sé al 100%, pero sí que hay un par de cosas importantes en este escenario:
a) por un lado la documentación advierte que «No llame a Sleep
desde el subproceso de la aplicación principal en la aplicación basada
en Silverlight. Si lo hace, la interfaz de usuario dejará de responder,
se bloquearán los eventos BackgroundWorker y DispatcherTimer, y se bloquearán las llamadas entre subprocesos al subproceso de la interfaz de usuario que se realizaron utilizando Dispatcher«.
b) Pero, sobre todo, hay que recordar que una aplicación Silverlight actualiza la interfaz de usuario desde la hebra principal de ejecución. Esto puede provocar situaciones intolerables cuando se están procesando grupos de ficheros locales, por ejemplo, y la IU no hace nada hasta que ese proceso concluye (pongamos por caso, creando bitmaps a partir de ficheros gráficos del equipo del usuario que van a ser presentados en pantalla). En este caso, debiéramos dejar la responsabilidad de la creación del Bitmap a un método que sea llamado cada vez que se produzca el evento CompositionTarget.Rendering, en una instrucción del tipo CompositionTarget.Rendering += new EventHandler(CrearBitmap). Si lo hacemos así, cada vez que un nuevo elemento (Bitmap, aquí), este construido y listo para ser mostrado, el motor de interpretación visual (rendering) actualizará la IU evitando esos lapsus por falta de respuesta.
c) El uso de System.Threading.Timer en Silverlight debiera de hacerse cuidadosamente, y, mejor aún, pensar en soluciones con DispatcherTimer, como demuestra Emil Stoychev en su artículo «Tip: Asynchronous Silverlight – Execute on the UI thread«.
d) Lo del 1 por el 0 será para darle tiempo a la pobre (hebra). De todas formas, y si os gusta eso del debugging a más bajo nivel -David (Salgado) y Pablo (Alvarez)…por si no la habíais leído…-)), fijaros lo que dice esa maravillosa «monstrua» que es Tess Ferrandez en «Debugging Silverlight applications with windbg and sos.dll«
Saludos
Marino