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
相关产品推荐
相关产品推荐

