为了账号安全,请及时绑定邮箱和手机立即绑定

图像保存损坏异步方式

图像保存损坏异步方式

C#
慕虎7371278 2022-09-04 16:36:05
为什么?当我保存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 中保存每个项目将导致任务被串行处理。只需将它们保存到列表中,即可使它们全部启动并基本并行运行。然后,您只需等待列表中所有任务的完成,以防止操作返回,直到工作完成。


查看完整回答
反对 回复 2022-09-04
  • 1 回答
  • 0 关注
  • 65 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信