StreamReader.ReadLineAsyn c () возвращает string.empty в режиме выпуска, но не в режиме отладки (в приложении Blazor WASM) - PullRequest
2 голосов
/ 28 мая 2020

Использование приложения Blazor wasm (NET стандарт 2.1) и BlazorFileReader в следующем фрагменте кода (сокращенно, в моем приложении он разделен на файл .razor и файл .razor.cs, но сокращены и собраны здесь для простоты):

@inject Blazor.FileReader.IFileReaderService fileReaderService
@using Blazor.FileReader;
    <div class="ml-2">
        <input type="file" @ref="InputElement" @onchange="FilesSelected" multiple accept=".txt,.csv" />
    </div>

@code {
        ElementReference InputElement;
        [Parameter] public List<string> FileContent { get; set; }
        async Task FilesSelected()
        {
            foreach (var file in await fileReaderService.CreateReference(InputElement).EnumerateFilesAsync())
            {
                using (Stream stream = await file.OpenReadAsync())
                {
                    FileContent = await ReadLinesAsync(stream, Encoding.UTF8);
                }
            }
        }
        public async Task<List<string>> ReadLinesAsync(Stream stream, Encoding encoding)
        {
            using (var reader = new StreamReader(stream, encoding))
            {
                string line;
                var result = new List<string>();
                while ((line = await reader.ReadLineAsync()) != null)
                {
                    result.Add(line);
                }
                return result;
            }
        }
}

Запуск этого кода в режиме отладки (предварительная версия Visual Studio 2019 v 16.6) отлично читает любой текстовый файл. Но при работе в режиме выпуска StreamReader.ReadLineAsyn c () возвращает пустые строки.

Кто-нибудь знает, почему ReadLineAsyn c () делает это? Я смотрел это ...

1 Ответ

2 голосов
/ 05 июня 2020

Это ошибка в текущей реализации Blazor.

Пока она не будет решена, вот обходной путь (код более или менее эквивалентен ... но работает!) :

    public async Task<List<string>> ReadLinesAsync(Stream stream, Encoding encoding)
    {
        using (var reader = new StreamReader(stream, encoding))
        {

            var result = new List<string>();
            string line = await reader.ReadLineAsync();
            while (line != null)
            {
                result.Add(line);
                line = await reader.ReadLineAsync();
            }
            return result;
        }
    }

Изменить: похоже, ошибка в оптимизаторе. Отключение параметра «Оптимизировать» (по умолчанию включено при компиляции в выпуске) является альтернативным обходным путем.

...