La aplicación My Win RT que ha trabajado con VS2012RC en una versión beta de Windows 8, ahora con las versiones finales de visual studio y Windows 8 pro el problema, que crear/abrir un archivo dentro de OnSuspending solo funciona si configuro un punto de interrupción de depurador en el método de creación de archivos.StorageFolder.CreateFileAsync falla cuando se le llama desde App.OnSuspending
private void OnSuspending(object sender, SuspendingEventArgs e){
var deferral = e.SuspendingOperation.GetDeferral();
if (null != m_document) Save();
deferral.Complete();
}
async void Save(){
var folder = KnownFolders.DocumentsLibrary;
var file = await folder.CreateFileAsync(GetFileName(),Windows.Storage.CreationCollisionOption.ReplaceExisting);
var xDoc = GetXDocument();
using (var stream = await file.OpenStreamForWriteAsync()){
xDoc.Save(stream);
}
}
Si fijo un punto de interrupción en
StorageFile file = await folder.CreateFileAsync(...
, el depurador entra en el y si continúo, todo funciona bien.Sin embargo, si no configuro un punto de interrupción, se creará el archivo, pero el contenido del xml no se guardará (el archivo descansa vacío).
Si configuro un punto de interrupción debajo de la línea
StorageFile file = await folder.CreateFileAsync(...
, ¡el depurador nunca entra!
¿Alguien tiene una idea? También probé una versión que usa folder.OpenStreamForWriteAsync
, con el mismo efecto.
¿Se acabó el tiempo para finalizar la operación? – mydogisbox
@mydogisbox: Parece que. Sin embargo, no sé por qué. Parece que el comando de espera en Guardar() no espera hasta la creación sino que vuelve inmediatamente (o después de la creación del archivo) fuera de la función de guardar. Esto también es lo que veo, si agrego Debug.WriteLine-calls después de cada llamada a un método.Sin un punto de interrupción, el código nunca alcanzará la llamada "var xDox = GetXDocument()". Vuelve después de la creación del archivo (pero sin excepción). – HCL