none
Notificar cambios desde Background agent a la aplicación principal RRS feed

  • Pregunta

  • Hola,

    Soy nuevo en Windows Phone y estoy desarrollando una aplicación sencilla con un Backgroung Agent. Sigo las buenas prácticas para la comunicación entre aplicación y Background Agent recomendadas en Background agent best practices for Windows Phone -> Communication between foreground app and background agent, para eso utilizo un archivo del Isolated Storage protegido con un mutex. Con esto no hay problema alguno, pero cuando guardo datos en el archivo desde el Background Agent, no encuentro la manera de alertar a la aplicación principal que hay cambios en los datos.

    Lo he intentado con una clase FileManager y con métodos y eventos estáticos:

    public class FileManager
    {
        private const string FILE_NAME = "Data.store";
    
        private static Mutex mutex = new Mutex(false, "DataFileMutex");
    
        public delegate void StoredDataChangedByAgentEventHandler();
        public static event StoredDataChangedByAgentEventHandler StoredDataChangedByAgent;
    
        //More methods...
    
        public static void StoreData(object saver, MyData data)
        {
            // Write to the Isolated Storage
            XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
            xmlWriterSettings.Indent = true;
    
            mutex.WaitOne();
            using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream stream = myIsolatedStorage.OpenFile(FILE_NAME, FileMode.Create))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(MyData));
                    using (XmlWriter xmlWriter = XmlWriter.Create(stream, xmlWriterSettings))
                    {
                        serializer.Serialize(xmlWriter, data);
                    }
                }
            }
            mutex.ReleaseMutex();
    
            if (saver is ScheduledTaskAgent)
            {
    #if DEBUG
                Debug.WriteLine("\t\tSaved from background agent...");
    #endif
                if (StoredDataChangedByAgent != null)
                    StoredDataChangedByAgent();
            }
        }
    }

    En el constructor de mi ViewModel añado la función para manejar el evento:

    FileManager.StoredDataChangedByAgent += FileManager_StoredDataChangedByAgent;

    Cuando desde el Background Agent llamo al método FileManager.StoreData(), el evento StoredDataChangedByAgent es igual a null, y no sé por qué.

    ¿Cómo puedo alertar a la aplicación principal que los datos han cambiado y que es necesario refrescar el interface de usuario con los datos de Isolated Storage?

    Un saludo.

    PD: estoy desarrollando para WP8, pero como no hay un foro para ello, lo pregunto aquí, non creo que haya mucha diferencia.


    • Editado Jon 123 miércoles, 9 de enero de 2013 12:19
    miércoles, 9 de enero de 2013 12:17

Todas las respuestas

  • Buenas!

    El evento StoredDataChangedByAgent es null por que la ejecución del background agent es diferente de la de tu aplicación, es decir, no es tu aplicación la que está completa en background ejecutándose, de esa forma el background agent no sabe realmente que alguien en la app principal está manejando el evento.

    Creo que la solución podría ir más por comprobar de forma periódica en la aplicación si los datos han cambiado...

    De todas formas, lo que no entiendo es porqué quieres tener un background agent haciendo el mismo trabajo que la aplicación cuando esta está iniciada.... normalmente esta técnica que comentas es para que el background agent trabaje cuando la app está cerrada y la app al abrirse compruebe ese archivo y lea los cambios.... Si tienes la aplicación abierta, debería ser ella la encargada de recoger datos o hacer lo que necesites.

    Un saludo!


    MCTS - .NET 4.0 Windows Applications
    MCTS - .NET 4.0 Data Access
    MCTS - .NET 4.0 Service Communication Applications
    MCPD - .NET 4.0 Windows Developer
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter

    miércoles, 9 de enero de 2013 17:42
    Moderador
  • Ok,

    Gracias Josue por responder. Más que nada pensaba hacerlo así para aprovechar que ya estaba hecho. Supongo que en la aplicación principal habrá que utilizar un DispatcherTimer y cada X tiempo hacer el mismo proceso que en el Background Agent, ¿no es así?

    jueves, 10 de enero de 2013 7:36
  • Esto ya no tiene mucho que ver, pero, me ha surgido una duda. Si un evento estático no sirve para las dos ejecuciones, ¿un mutex sí sirve? Lo digo por la recomendación que hace MS para la comunicación entre Background Agent y aplicicación principal.
    jueves, 10 de enero de 2013 7:41