c # UWP ReadTextAsync завершается с ошибкой в 2 раза

#c# #uwp #io

#c# #uwp #io

Вопрос:

Итак, я пытаюсь импортировать 2 конфигурации из локальной папки с помощью Windows.Storage . Но во второй раз он завершается с ошибкой без исключения. Это мой код:

 public async Task<string> ImportLines(string filename)
{
            try
            {
                Windows.Storage.StorageFile importFile = await StorageFolder.GetFileAsync(filename);
                string savedString = await Windows.Storage.FileIO.ReadTextAsync(importFile);
                return savedString;
            }
            catch (Exception)
            {
             //log
            }
}
  

Я вызываю этот метод с:

         public async void LoadConfig()
        {

            if (File.Exists(_textDataHandler.StorageFolder.Path   @""   PluginsFilename))
            {
                string tmp = await _textDataHandler.ImportLines(PluginsFilename);
                Plugins = JsonConvert.DeserializeObject<PluginConfiguration>(tmp);

            }
            else
            {
                CreateDefaultPluginsConfiguration();
                //log
                _textDataHandler.CreateFile(_pluginsFilename);
                string export = JsonConvert.SerializeObject(Plugins, Formatting.Indented);
                _textDataHandler.ExportText(_pluginsFilename, export);
                //log
            }

            if (File.Exists(_textDataHandler.StorageFolder.Path   @""   _settingsFilename))
            {

                string tmp = await _textDataHandler.ImportLines(Settingsfilename);
                Config = JsonConvert.DeserializeObject<Configuration>(tmp);
                _textDataHandler.CreateFile(Config.DatabaseFilename);
            }
            else
            {

                CreateDefaultSettingsConfiguration();
                //log
                _textDataHandler.CreateFile(_settingsFilename);
                string export = JsonConvert.SerializeObject(Config, Formatting.Indented);
                _textDataHandler.ExportText(_settingsFilename, export);
                //Log
            }


        }
  

Если одна конфигурация не существует, все в порядке, но если обе существуют, она завершается с ошибкой во второй раз

Комментарии:

1. У меня не так много знаний в этой области, вы проверили эти образцы? github.com/Microsoft/Windows-universal-samples/tree/master /…

Ответ №1:

Если вы создали асинхронный метод. пожалуйста, избегайте синхронного вызова с GetResult . Вы могли бы добавить await ключевое слово перед вызывающей строкой.

 private async void Button_Click(object sender, RoutedEventArgs e)
{
    string tmp = await ImportLines(Filename);
}
  

Обновить

Пожалуйста, попробуйте использовать dataReader для чтения содержимого файла.

 public async Task<string> ImportLines(string filename)
{
    try
    {
        StorageFile importFile = await ApplicationData.Current.LocalFolder.GetFileAsync(filename);
        var buffer = await FileIO.ReadBufferAsync(importFile);
        using (var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(buffer))
        {
            return dataReader.ReadString(buffer.Length);
        }
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
}
  

Комментарии:

1. У меня было await ключевое слово перед GetResult , но у меня была та же проблема.

2. Пожалуйста, поделитесь своим ImportLines методом, я тестировал публичную асинхронность Task<string> ImportLines(string filename) { try { Windows.Storage.StorageFile importFile = await ApplicationData.Current.LocalFolder.GetFileAsync(filename); string savedString = await Windows.Storage.FileIO.ReadTextAsync(importFile); return savedString; } catch (Exception ex) { return ex.Message; } } , она работает хорошо.

3. Да, но это ничего не меняет, потому что оно работает до ReadBufferAsync , а затем останавливается.