【问题标题】:StreamReader.ReadLineAsync() returns string.empty in release mode but not in debug mode (in Blazor WASM app)StreamReader.ReadLineAsync() 在发布模式下返回 string.empty,但在调试模式下不返回(在 Blazor WASM 应用程序中)
【发布时间】:2020-09-15 23:38:15
【问题描述】:

在以下代码 sn-p 中使用 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.ReadLineAsync() 返回空字符串。

有人知道为什么 ReadLineAsync() 会这样做吗?我看过this...

【问题讨论】:

    标签: blazor streamreader webassembly


    【解决方案1】:

    这是 Blazor 当前实现中的 bug

    在解决之前,这里有一个解决方法(代码或多或少是等效的......但有效!):

        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;
            }
        }
    

    编辑:错误似乎在优化器中。关闭“优化”(在 Release 中编译时默认打开)是一种替代解决方法。

    【讨论】:

      猜你喜欢
      • 2018-07-31
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多