MSDN España

Noticias, avisos, reflexiones... del equipo que hay detrás de MSDN en España... también tendremos alguna que otra firma invitada :)

Windows 8 Tips & Tricks. Modificar la interfaz desde un hilo secundario (XAML/C#)

Windows 8 Tips & Tricks. Modificar la interfaz desde un hilo secundario (XAML/C#)

[Nota: Este artículo pertenece a nuestra serie de Windows 8 Tips & Tricks]

 

Algunas veces necesitamos realizar cambios en la interfaz desde otros hilos, por ejemplo cuando queremos notificar al usuario de forma gráfica de un cambio en el estado de red.

[Channel9 y YouTube]

Cuando intentamos modificar la interfaz desde otro hilo, obtendremos un mensaje como este:

image

 

El código que está generando el problema está basado en el Tips & Tricks de Detección de red y es el siguiente:

void NetworkInformation_NetworkStatusChanged(object sender)
{
    if (NetworkInformation.GetInternetConnectionProfile() == null)
    {
        if (_hayConexion)
        {
            _hayConexion = false;
            //Código a ejecutar cuando se pierda la conexión
            //La siguiente línea lanzará una excepción
            estadoConexion.Text = "¡Se ha perdido la conexión!";
        }
    }
    else
    {
        if (!_hayConexion)
        {
            _hayConexion = true;
            //Código a ejecutar cuando se recupere la conexión
            //La siguiente línea lanzará una excepción
            estadoConexion.Text = "¡Se ha recuperado la conexión!";
        }
    }
}

 

Para evitarlo tenemos que hacer que sea el dispatcher gráfico quien realice las modificaciones en la interfaz. El primer paso es guardar una referencia al dispatcher en una variable de clase:

//En la clase
private CoreDispatcher _dispatcher;

//En el constructor
_dispatcher = Window.Current.Dispatcher;

 

Ahora ya podemos modificar nuestro método haciendo uso de “_dispatcher.RunAsync” y marcando nuestro método como “async”:

async void NetworkInformation_NetworkStatusChanged(object sender)
{
    if (NetworkInformation.GetInternetConnectionProfile() == null)
    {
        if (_hayConexion)
        {
            _hayConexion = false;
            //Código a ejecutar cuando se pierda la conexión
            await _dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                () => { estadoConexion.Text = "¡Se ha perdido la conexión!"; });
        }
    }
    else
    {
        if (!_hayConexion)
        {
            _hayConexion = true;
            //Código a ejecutar cuando se recupere la conexión
            await _dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                () => { estadoConexion.Text = "¡Se ha recuperado la conexión!"; });            
        }
    }
}

 

El método “NetworkInformation_NetworkStatusChanged” es ejecutado por otro hilo, pero ahora hacemos que sea el dispatcher quien realice los cambios sobre la interfaz, por lo que no habrá ningún problema.

 

Si tienes alguna duda, recuerda que tienes a tu disposición el foro de desarrollo de aplicaciones para Windows 8 en castellano, donde podrás compartir tus conocimientos con la comunidad de desarrolladores y encontrar ayuda para resolver tus dudas técnicas, y una Introducción al desarrollo de aplicaciones para Windows 8.

También puedes estar al día de todas las novedades a través de nuestros rincones en las redes sociales:

Un saludo,

      Pablo Carballude

Blog: formulario de comentarios de publicación (CAPTCHA)