我有一个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"));
}
答案 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上的保存速度甚至更快。与直接保存文件相比,花费更多的滴答声来旋转线程。