图像保存损坏异步方式

为什么?当我保存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);

            }

        }


慕虎7371278
浏览 66回答 1
1回答

慕森卡

如果未等待,则操作几乎肯定会在实际任务完成之前返回。当操作超出范围时,它会随之获取其所有作用域变量,包括从 post 正文绑定的实例。这将导致写入被过早取消,留下一个损坏的文件(因为流在写入过程中被破坏)。将引发异常,但由于您正在新线程中运行,因此它不会通过请求管道冒泡,并且会被有效地吞噬。Task.RunSaveFileIFormFile长短,等待您的电话。但是,一旦你这样做了,那么在这里使用实际上就没有意义了。所以,你最好完全摆脱它。相反,只需启动所有任务,然后等待:Task.RunTask.RunTask.WhenAllvar tasks = new List<Task>();foreach (var item in Images)&nbsp;{&nbsp; &nbsp; // item.File is IFormFile array&nbsp; &nbsp; tasks.Add(SaveFile(item.FileSavePath, item.File));}await Task.WhenAll(tasks);任务返回热,或已启动。因此,等待在 foreach 中保存每个项目将导致任务被串行处理。只需将它们保存到列表中,即可使它们全部启动并基本并行运行。然后,您只需等待列表中所有任务的完成,以防止操作返回,直到工作完成。
打开App,查看更多内容
随时随地看视频慕课网APP