在我的网站中,我使用控制器生成图像缩略图。我的代码看起来像:
var filePath = getThumbnailPath();
if (!File.Exists(filePath)
{
... create thumbnail
}
return new Filestream(...)
问题是,如果两个用户请求相同的缩略图,如果没有创建,我将在创建时遇到异常。 如何在不引入太多开销的情况下有效地使用文件名对象上的锁?
Aristos评论后的重构代码:
Mutex m = new Mutex(false, originalImagePath);
m.WaitOne();
try
{
if (!File.Exists(originalImagePath))
{
... create thumbnail
}
}
finally
{
m.ReleaseMutex();
}
答案 0 :(得分:3)
将缩略图的创建委托给其他服务。用户将生成创建缩略图的请求。另一项服务将使用此请求并执行实际工作。
什么是服务,您可以选择适合自己的服务。它可以是WCF服务,Windows服务,消息队列或其他。
直接在ASP.NET网站中使用锁定通常不是一个好主意,因为它会引入瓶颈。
答案 1 :(得分:1)
ASP.NET站点具有能够运行多个进程(例如Web场等)的概念。 lock
仅锁定在单个进程中。无论出于何种原因,如果您的代码在多个进程中运行,您将回到同样的问题。
此外,您对字典的使用需要是线程安全的。就这样,它可以为同一个文件名写入多个值。
我建议使用名为Mutex
的人。这允许跨进程互斥。互斥锁的名称可以只是文件名。不需要字典。
向另一个服务发出网络请求似乎是它为您的网站引入了更多延迟。 (例如,向您的网站请求图片的请求需要向此“服务”发出二级网络请求以获取图像 - 或获取图像的位置。)