2012-03-06 9 views
6

Poniższy kod wydaje się czasami powodować utworzenie tego stosu. Wygląda na to, że dzieje się to w ramach, gdy metoda dispose jest wywoływana na wewnętrznym obiekcie FileStream? Wydaje mi się, że to błąd, jakieś pomysły?Plik MonoTouch File.ReadAllText zgłasza wyjątek w wewnętrznym pliku FileStream.Dispose()

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 

EDIT VersionFile ścieżka chwycony w ten sposób:

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

co jest przekazywane za pomocą 'Paths.VersionFile'? –

+0

@ DanielA.White Zobacz zmiany –

+1

Potrzebujemy więcej kontekstu dotyczącego Twojej aplikacji, np. Mogę uruchomić kod w pętli za 10000x bez żadnego problemu, ponieważ coś innego musi się różnić. Na przykład kiedy jest tworzony, aktualizowany, usuwany? przez jakikolwiek inny wątek? czy występuje na urządzeniach, symulatorach, obu? ... i wszystkie numery wersji. – poupou

Odpowiedz

0

Gdybym miał zgadywać, myślę, że może być uruchomiony w wyścigu ze względu na ukryty Flush(), który występuje podczas usuwania pod maską FileStream w tym wywołaniu ReadAllText.

(uwaga: nie przed źródeł monofonicznych, więc nie mogę potwierdzić dokładnej zachowanie)

Czy to możliwe, że:

  • wymieniasz/wznowienie/etc. ta sama ścieżka pliku w innym wątku?
  • Usunięcie tej ścieżki natychmiast po lub w innym wątku?
  • W przeciwnym razie tracąc dostęp do sprawdzonej ścieżki? (odmawianie udostępniania plików?)