You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Server文件上传偶发并发读写不支持错误求助

Blazor InputFile上传文件时并发读写错误的解决方案

使用Blazor Server的InputFile组件上传同一张图片时,偶尔会出现以下错误:

System.InvalidOperationException: Concurrent reads or writes are not supported.
at System.IO.Pipelines.Pipe.GetFlushResult(FlushResult& result)
...(省略后续调用栈)

报错行集中在await browserFile.OpenReadStream(5 * 1024 * 1024).CopyToAsync(fs);,以下是针对性的解决办法:

可能的原因

这个错误通常源于同一个BrowserFile实例被多次读取,或是上传过程中组件状态变化导致流连接意外中断(比如快速重复触发上传、组件重新渲染)。

解决方案

1. 确保流被正确释放,避免重复读取

将OpenReadStream的结果赋值给独立变量,并用await using确保流在使用后被正确释放,避免同一个BrowserFile被多次读取:

private async Task UploadImage(InputFileChangeEventArgs e)
{
    var browserFile = e.File;
    var path = System.IO.Path.GetTempFileName();
    await using FileStream fs = new(path, FileMode.Create);
    // 显式创建流实例并确保释放
    await using var fileStream = browserFile.OpenReadStream(5 * 1024 * 1024);
    await fileStream.CopyToAsync(fs);
}

2. 添加上传状态锁,防止重复触发

在组件中增加一个状态标记,避免用户快速重复点击或多次触发上传事件:

private bool isUploading;

private async Task UploadImage(InputFileChangeEventArgs e)
{
    if (isUploading) return;
    try
    {
        isUploading = true;
        var browserFile = e.File;
        var path = System.IO.Path.GetTempFileName();
        await using var fs = new FileStream(path, FileMode.Create);
        await using var fileStream = browserFile.OpenReadStream(5 * 1024 * 1024);
        await fileStream.CopyToAsync(fs);
    }
    finally
    {
        isUploading = false;
    }
}

3. 确保上传逻辑在正确的同步上下文执行

如果组件在上传过程中发生重新渲染,可能导致RemoteJSDataStream连接中断。用InvokeAsync包裹上传逻辑,确保在Blazor的同步上下文中执行:

private async Task UploadImage(InputFileChangeEventArgs e)
{
    await InvokeAsync(async () =>
    {
        var browserFile = e.File;
        var path = System.IO.Path.GetTempFileName();
        await using var fs = new FileStream(path, FileMode.Create);
        await using var fileStream = browserFile.OpenReadStream(5 * 1024 * 1024);
        await fileStream.CopyToAsync(fs);
    });
}

4. 升级.NET版本至最新补丁

该错误在Blazor Server的部分早期.NET 6版本中存在,升级到.NET 6的最新补丁包,或直接升级到.NET 7/8,可修复底层的管道流并发问题。

内容的提问来源于stack exchange,提问作者vikben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:22:40