Sobre el porqué recomienda la documentación el uso de 1 en vez de 0 en Thread.Sleep(1) para Silverlight

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

Miguel Katrib (Univ. de la Habana) y Dino Esposito (iDesign/MS-Press/MSDN Magazine), en España

Ambos son bien conocidos en el mundo del desarrollo. El primero, autor de  varias obras y Catedrático de Computación en la U. de la Habana, y el segundo uno de los autores de MS-Press más populares, además de colaborador habitual de MSDN Magazine (Sección Cutting Edge), y ponente habitual en Tech-Ed’s y VS-Live y eventos similares. Se trata de tres eventos de dos días en los que también estaré yo, donde impartiremos clases más avanzadas sobre el estado del desarrollo con Silverlight (en  mi caso), C# 3.0 y LINQ (Katrib) y  Diseño y arquitectura de aplicaciones .NET (D. Esposito).  Estos son los datos concretos, por orden cronológico), para el que le pueda interesar:

Instructor: Marino Posadas

                                  Marino Posadas trabaja como Software Architect en Alhambra-Eidos, es Microsoft MVP en Visual C#, además de titulado MCSD, MCAD, MCT y                                MSFP. Conferenciante en diversos eventos organizados por Alhambra-Eidos, Microsoft y varias universidades españolas y extranjeras, trabaja                     en la actualidad en la implantación de arquitecturas ricas de cliente (Silverlight, WPF) y su integración con otras herramientas como Sharepoint              y CRM. Recientemente ha publicado la obra “Programación con Silverlight 2.0” y un curso “on-line” en MSDN España .


Integrando el lenguaje de la lógica del negocio con el mundo de los datos. C#3.0 y LINQ / 5-6 de mayo

Instructor: Miguel Katrib

Miguel KatribMiguel Katrib es Dr. Profesor Titular jefe de la cátedra de Programación e Ingeniería de Software de la Facultad de Matemática y Computación de la Universidad de la Habana y miembro de la Academia de Ciencias de Cuba. Ha sido profesor y conferenciante invitado en varias universidades españolas, es el líder del grupo WEBOO dedicado a la tecnología .NET .


Design and Architecture for .NET Applications* / 16-17 de junio

Dino EspositoArquitecto y formador en IDesign, Dino Esposito es una de las autoridades mundiales reconocidas en tecnologías Web y arquitectura de software. Dino es ponente regular en eventos de la industria de ámbito mundial, como TechEd o DevConnections, y europeos como DevWeek y Basta. Ha publicado una docena de obras en MS-Press y otras editoriales internacionales.

*Master class impartida en inglés, con traducción únicamente para resolución de dudas

 Para datos concretos de registro y demás, podéis visitar el sitio asociado con estos Masters.

Saludos

Marino