StreamReader.ReadLineAsync() returns string.empty 处于发布模式但不处于调试模式(在 Blazor WASM 应用程序中)
StreamReader.ReadLineAsync() returns string.empty in release mode but not in debug mode (in Blazor WASM app)
使用 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() returns 空字符串。
有谁知道为什么 ReadLineAsync() 这样做?我看过 this...
这是 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;
}
}
编辑:错误似乎在优化器中。关闭 "Optimize"(在 Release 中编译时默认打开)是一种替代解决方法。
使用 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() returns 空字符串。
有谁知道为什么 ReadLineAsync() 这样做?我看过 this...
这是 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;
}
}
编辑:错误似乎在优化器中。关闭 "Optimize"(在 Release 中编译时默认打开)是一种替代解决方法。