Если Task.Run
не ожидается, то действие почти наверняка вернется до того, как фактические задачи SaveFile
будут завершены.Когда действие выходит из области видимости, оно забирает все свои переменные области действия, включая ваши IFormFile
экземпляры, которые были связаны с телом сообщения.Это приведет к преждевременному прекращению записи, в результате чего вы получите поврежденный файл (так как поток уничтожается в середине записи).Возникнет исключение, но, поскольку вы работаете в новом потоке, он не будет пузыриться в конвейере запросов и будет эффективно поглощен.,Однако, как только вы это сделаете, тогда нет смысла использовать Task.Run
здесь.Итак, вам лучше просто избавиться от этого полностью.Вместо этого просто запустите все задачи и дождитесь Task.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 приведет к последовательной обработке задач.Простое сохранение их в список приводит к их запуску и параллельной работе.Затем вы просто ждете завершения всех задач в списках, чтобы предотвратить возврат действия до завершения работы.