Как выполнить действие после отправки клиентского запроса? - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть действие MVC, которое изменяет размер изображения и возвращает его пользователю. Я хочу записать измененное изображение на диск для кеша. Но я не хочу откладывать ответ пользователя и возвращать его до того, как кеш будет записан. Каков наилучший способ сделать это?

В настоящее время у меня есть этот код:

public async Task<IActionResult> Resize(string fileName, int width = 0, int height = 0)
{
    var imageStream = await _fileService.GetImageAsync(fileName);
    var resizedImageStream = Resize(imageStream, width, height);

    //I want to execute this action after responce              
    async _fileService.SaveResizedAsync(fileName, resizedImageStream);

    resizedImageStream.Seek(0, SeekOrigin.Begin);
    return File(resizedImageStream, MimeUtility.GetMimeMapping("image.png"));
}

1 Ответ

0 голосов
/ 01 ноября 2018

В общем, вам нужно разгрузить его в фоновый поток. Самый простой способ сделать это с помощью Task.Run, особенно если вам не нужен возврат:

Task.Run(() => {
    // save image data to file system
});

return File(resizedImageStream, MimeUtility.GetMimeMapping("image.png"));

Task.Run запустит новый поток для выполнения работы, содержащейся в лямбда-выражении, и, поскольку здесь этого не ожидается, обработка вашего кода будет продолжена до строки return.

Однако это наивный подход. Любые исключения будут проглочены, поэтому сохранение изображения может полностью потерпеть неудачу и восстановить его невозможно. Так как это только для целей кэширования, это не может быть проблемой. Если это не удастся, то в худшем случае вы просто создадите его снова в следующий раз. Честно говоря, даже на механическом жестком диске со скоростью 5400 об / мин сохранение образа должно занимать считанные миллисекунды и даже быстрее на типичном диске серверного класса или SSD. Вероятно, вы потратите больше тиков на процесс, чем просто сохраните файл напрямую.

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