2012-03-06 21 views
6

El siguiente código parece ocasionalmente producir esta stacktrace. Parece que está sucediendo dentro del marco cuando se invoca el método de eliminación en el objeto interno FileStream? Me parece un error, ¿alguna idea?MonoTouch File.ReadAllText arroja una excepción en FileStream.Dispose() interno

var previousVersion = long.Parse(File.ReadAllText(Paths.VersionFile)); 

StackTrace:

System.IO.IOException: Invalid parameter 
     at System.IO.FileStream.Dispose (Boolean disposing) [0x00000] in <filename unknown>:0 
     at System.IO.Stream.Close() [0x00000] in <filename unknown>:0 
     at System.IO.StreamReader.Dispose (Boolean disposing) [0x00000] in <filename unknown>:0 
     at System.IO.TextReader.Dispose() [0x00000] in <filename unknown>:0 
     at System.IO.File.ReadAllText (System.String path) [0x00000] in <filename unknown>:0 
     at CatalystHD.Shared.BaseLoginController.CheckIfFirstRunThisVersion() [0x00000] in <filename unknown>:0 
     at CatalystHD.Shared.BaseLoginController.ViewDidLoad() [0x00000] in <filename unknown>:0 
     at MonoTouch.UIKit.UIViewController.get_View() [0x00000] in <filename unknown>:0 
     at CatalystHD.IPad.RootViewController.AnimateTo (MonoTouch.UIKit.UIViewController aController, UIViewAnimationTransition transition) [0x00000] in <filename unknown>:0 
     at CatalystHD.IPad.RootViewController.Logout (Boolean timeout) [0x00000] in <filename unknown>:0 
     at CatalystHD.IPad.NotebookSelectionController.logoutButton_Clicked (System.Object sender, System.EventArgs e) [0x00000] in <filename unknown>:0 
     at MonoTouch.UIKit.UIBarButtonItem Callback.Call (MonoTouch.Foundation.NSObject sender) [0x00000] in <filename unknown>:0 
     at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00000] in <filename unknown>:0 
     at MonoTouch.UIKit.UIApplication.Main (System.String[] args) [0x00000] in <filename unknown>:0 
     at CatalystHD.Application.Main (System.String[] args) [0x00000] in <filename unknown>:0 

EDITAR VersionFile ruta se agarró de esta manera:

public static string VersionFile { 
    get { 
     var path = Environment.GetFolderPath(Environment.SpecialFolder.Personal); 
     return Path.Combine(path, "version.dat"); 
    } 
} 
+0

¿Qué se está transmitiendo con 'Paths.VersionFile'? –

+0

@ DanielA.White Ver ediciones –

+1

Necesitaremos más contexto sobre su aplicación, p. Puedo ejecutar el código en un bucle para 10000x sin ningún problema, porque algo más debe ser diferente. ¿Cuándo se creó, actualizó y eliminó ese archivo? por cualquier hilo diferente? ocurre en dispositivos, simulador, ambos? ... y todos los números de versión. – poupou

Respuesta

0

Si tuviera que adivinar, creo que puede ser que funcione en una condición de carrera debido a la implícita Flush() que se produce durante la eliminación de debajo del cofre FileStream en esa llamada ReadAllText.

(advertencia: no delante de fuentes mono, por lo que no puede confirmar comportamiento exacto)

¿Es posible que:

  • Usted está reemplazando/reapertura/etc. la misma ruta de archivo en otro hilo?
  • ¿Eliminar esa ruta inmediatamente después o en otro hilo?
  • De lo contrario, perder el acceso a la ruta marcada? (¿Deshacer el intercambio de archivos?)
Cuestiones relacionadas