MonoTouch File.ReadAllText создает исключение для внутреннего FileStream.Dispose () - PullRequest
6 голосов
/ 06 марта 2012

Следующий код, кажется, иногда производит эту трассировку стека. Похоже, что это происходит в рамках, когда метод dispose вызывается для внутреннего объекта FileStream? Для меня это похоже на ошибку, есть идеи?

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 путь получен следующим образом:

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

1 Ответ

0 голосов
/ 05 октября 2012

Если бы мне пришлось угадывать, я думаю, что вы можете столкнуться с состоянием гонки из-за неявного Flush(), возникающего при удалении скрытого FileStream в этом ReadAllText вызове.

(предостережение: не перед моно источниками, поэтому не может подтвердить точное поведение)

Возможно ли, что:

  • Вы заменяете / открываете /и т.п.тот же путь к файлу в другом потоке?
  • Удаление этого пути сразу после или в другом потоке?
  • В противном случае потеря доступа к проверенному пути?(общий доступ к файлам отключен?)
...