Изображение сохранено поврежденным асинхронным способом - PullRequest
0 голосов
/ 11 февраля 2019

Почему?когда я сохраняю 2 изображения, первое сохранено поврежденным, а второе вообще не сохранено

я хочу сохранить файл без зависания клиента (Task.Run) и без зависания сервера (async await)

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 Ответ

0 голосов
/ 11 февраля 2019

Если 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 приведет к последовательной обработке задач.Простое сохранение их в список приводит к их запуску и параллельной работе.Затем вы просто ждете завершения всех задач в списках, чтобы предотвратить возврат действия до завершения работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...