C# 以异步方式保存损坏的图像

C# 以异步方式保存损坏的图像,c#,asp.net-core-2.1,C#,Asp.net Core 2.1,为什么??当我保存两个图像时,第一个保存的图像已损坏,第二个未损坏 根本救不了 我想保存文件而不卡住客户端(Task.Run)并 没有服务器卡住(异步等待) 如果未等待Task.Run,则几乎肯定会在实际SaveFile任务完成之前返回操作。当操作超出作用域时,它会带上所有作用域变量,包括从post正文绑定的IFormFile实例。这将导致写入被提前取消,留下一个损坏的文件(因为流在写入过程中被破坏)。将引发异常,但由于您在新线程中运行,因此它不会在请求管道中冒泡,并被有效地吞没 长时间和短时间

为什么??当我保存两个图像时,第一个保存的图像已损坏,第二个未损坏 根本救不了

我想保存文件而不卡住客户端(Task.Run)并 没有服务器卡住(异步等待)


如果未等待
Task.Run
,则几乎肯定会在实际
SaveFile
任务完成之前返回操作。当操作超出作用域时,它会带上所有作用域变量,包括从post正文绑定的
IFormFile
实例。这将导致写入被提前取消,留下一个损坏的文件(因为流在写入过程中被破坏)。将引发异常,但由于您在新线程中运行,因此它不会在请求管道中冒泡,并被有效地吞没

长时间和短时间,等待您呼叫
任务。运行
。然而,一旦您这样做了,那么使用
Task.Run
就毫无意义了。所以,你最好干脆把它全部扔掉。相反,只需启动所有任务,然后等待
任务。当所有

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);
var tasks=newlist();
foreach(图像中的变量项)
{
//文件是一个文件数组
添加(保存文件(item.FileSavePath,item.File));
}
等待任务。何时(任务);

任务返回热状态,或已启动。同样地,等待foreach中保存的每个项目将导致以串行方式处理任务。只需将它们保存到一个列表中,就可以使它们基本上并行地启动和运行。然后,您只需等待列表中所有任务的完成,以防止操作返回,直到工作完成。

也许您没有等待您的
任务。运行
?@Vlad:它还会完成线程/继续吗?还是代码会过早地悄然消亡?@RobertHarvey:我假设应用程序在任务准备就绪之前就退出了。它之所以能工作是因为范围得到了维护,但如果你不等待,你最终会吞下异常,如果出了问题,就没有机会恢复。如果你想了解背景,那是一个完全不同的讨论。
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);