es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encuesta en Xamarin sin quedarse atascado

Estoy implementando una aplicación con Xamarin.

La aplicación necesita actualizar los datos a través de Wi-Fi con el dispositivo y mostrar los nuevos datos en la pantalla.

Pero cuando se activa la recuperación de datos, la aplicación siempre se queda bloqueada durante unos segundos.

protected async override void OnAppearing()
{
    // Mostrar nuevos datos al ingresar a esta página
    await Polling();
}

async Task Polling()
{
    await Read_Data();
    Show_Data();
}

¿Cómo puedo hacer esto sin que se quede bloqueada? ¿Cómo puedo hacer que la aplicación recupere los datos de manera fluida?

Quiero llamar a la función Polling() cada 30 segundos.

¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para evitar que la aplicación se quede bloqueada al utilizar el “polling”, puedes utilizar un temporizador en lugar del método asíncrono con await. Puedes lograr esto implementando un temporizador que active el método Polling() cada 30 segundos.

    Aquí tienes un ejemplo de código que puedes modificar según tus necesidades:

    private Timer _timer;
    private bool _isPolling;
    
    protected override void OnAppearing()
    {
        _isPolling = false;
        StartPolling();
    }
    
    protected override void OnDisappearing()
    {
        StopPolling();
    }
    
    private void StartPolling()
    {
        _timer = new Timer(Polling, null, 0, 30000);
    }
    
    private void StopPolling()
    {
        _timer?.Dispose();
        _timer = null;
    }
    
    private async void Polling(object state)
    {
        if (_isPolling) return;
        _isPolling = true;
    
        try
        {
            await Leer_Datos();
            Mostrar_Datos();
        }
        catch (Exception ex)
        {
            // manejar la excepción
        }
        finally
        {
            _isPolling = false;
        }
    }
    

    En este código, el método StartPolling() inicializa un temporizador que activa el método Polling() cada 30 segundos. El método Polling(), que se ejecuta de forma asíncrona, lee y muestra los nuevos datos.

    La variable booleana _isPolling se utiliza para evitar la superposición de las llamadas al polling. Si el polling anterior no ha finalizado, se omitirá el siguiente para evitar conflictos.

    Además, el método OnDisappearing() detiene el temporizador cuando la página no está activa, lo cual ayuda a reducir el consumo de batería y mejorar el rendimiento de la aplicación.

    ¡Espero que esto te sea útil!

Comments are closed.