为什么?当我保存2个图像时,第一个保存已损坏,第二个根本没有保存我想保存文件而不卡住客户端(Task.Run)和不卡住服务器(异步等待)Task.Run(async () => { foreach (var item in Images) { // item.File is IFormFile array await SaveFile(item.FileSavePath, item.File); }}); public static async Task SaveFile(string filePath, IFormFile file) { string folderPath = Path.GetDirectoryName(filePath); if (!Directory.Exists(folderPath)) Directory.CreateDirectory(folderPath); using (var fileStream = new FileStream(filePath, FileMode.Create)) { await file.CopyToAsync(fileStream); } }
1 回答
慕森卡
TA贡献1806条经验 获得超8个赞
如果未等待,则操作几乎肯定会在实际任务完成之前返回。当操作超出范围时,它会随之获取其所有作用域变量,包括从 post 正文绑定的实例。这将导致写入被过早取消,留下一个损坏的文件(因为流在写入过程中被破坏)。将引发异常,但由于您正在新线程中运行,因此它不会通过请求管道冒泡,并且会被有效地吞噬。Task.RunSaveFileIFormFile
长短,等待您的电话。但是,一旦你这样做了,那么在这里使用实际上就没有意义了。所以,你最好完全摆脱它。相反,只需启动所有任务,然后等待:Task.RunTask.RunTask.WhenAll
var tasks = new List<Task>();
foreach (var item in Images)
{
// item.File is IFormFile array
tasks.Add(SaveFile(item.FileSavePath, item.File));
}
await Task.WhenAll(tasks);
任务返回热,或已启动。因此,等待在 foreach 中保存每个项目将导致任务被串行处理。只需将它们保存到列表中,即可使它们全部启动并基本并行运行。然后,您只需等待列表中所有任务的完成,以防止操作返回,直到工作完成。
- 1 回答
- 0 关注
- 65 浏览
添加回答
举报
0/150
提交
取消