2

在我的网站中,我使用控制器生成图像缩略图。我的代码看起来像:

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();
 } 
4

2 回答 2

3

将缩略图的创建委托给其他服务。用户将产生创建缩略图的请求。另一个服务将使用此请求并执行实际工作。

什么是服务,你可以自己选择。它可以是 WCF 服务、Windows 服务、消息队列或其他东西。

直接在 ASP.NET 网站中使用锁定通常不是一个好主意,因为它会引入瓶颈。

于 2012-08-08T18:27:54.207 回答
1

ASP.NET 站点的概念是能够运行多个进程(例如网络农场等)。 lock仅在单个进程中锁定。如果出于某种原因,您的代码在多个进程中运行,您将回到同样的问题。

此外,您对字典的使用需要是线程安全的。事实上,它可以为同一个文件名写入多个值。

我建议使用命名的Mutex. 这允许跨进程互斥。互斥锁的名称可以只是文件名。不需要字典。

向另一个服务发出网络请求似乎会给对您站点的请求引入更多延迟。(例如,向您的站点请求图像需要向此“服务”发出辅助网络请求以获取图像 - 或获取图像的位置)。

于 2012-08-08T21:01:17.337 回答