客户请求发送后如何执行动作?

时间:2018-11-01 13:04:44

标签: asp.net-core asp.net-core-mvc

我有一个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 :(得分:0)

通常,您需要将其卸载到后台线程。最简单的方法是使用Task.Run,尤其是因为您不需要返回:

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

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

Task.Run将触发一个新线程来执行lambda中包含的工作,并且由于此处未等待它,因此您的代码处理将继续到return这一行。

>

但是,这是一种幼稚的方法。任何异常都会被吞没,因此图像的保存可能会完全失败,并且无法恢复。由于这仅是出于缓存目的,因此这可能不是问题。如果确实失败,最坏的情况就是您下次将再次生成它。老实说,即使在5400 RPM机械硬盘上,保存映像也要花费几毫秒的时间,在典型的服务器级驱动器或SSD上的保存速度甚至更快。与直接保存文件相比,花费更多的滴答声来旋转线程。