2014-06-18 61 views
4

我有一个web应用程序将图像返回到我的前端。 在这个应用程序中会发生什么情况是:当对特定图像发出请求时,应用程序检查图像是否已经存在于磁盘上,如果存在则返回图像。当图像不存在于磁盘上时,我的问题就开始了。当同一时间对同一图像发出两个请求并且它不存在于磁盘上时,我遇到了问题,因为两个线程尝试同时在磁盘上创建相同的文件。 为了解决这个问题,开始我尝试做的是在创建磁盘映像时创建一个Mutex。但它有一个问题。由于大量的同时请求导致服务器崩溃,因此服务器负载很大。锁定文件创建的最佳方式(最佳性能)

我想问一下你的想法是如何解决这个问题的。或者如果你不这样做?

谢谢。

+0

也许这个链接可能包含有用的信息http://social.msdn.microsoft.com/Forums/vstudio/en-US/a5300fc5-126c-4e33-8ae6-13376031e9fe/how-to-lock-or -unlock-a-file-using-c?forum = csharpgeneral –

回答

2

你可以尝试以下方式:

  1. 尝试读取图像(如果成功了,比做)
  2. 尽量只
  3. 上的“使用例外文件创建写入锁定图像”小的延迟(毫秒)
  4. 回到步骤1(重试)

使延迟非常小,大于TH只是一点点应该需要创建一个图像。 执行重试限制,最多3次左右。

这将允许您利用已有的(文件)的锁定机制

+0

这似乎是个好主意!我会尝试的。谢谢 –

-1

可以调用open功能与O_CREATO_EXCL标志。第一个进程的公开调用将获得独占访问权限来创建文件,并且它将开始下载图像。后续进程的公开调用将失败,因为它们的打开不是唯一的,“errno”将设置为EEXIST。

根据您的设计,后续流程可以等待完整的文件创建或返回。

fd = open(path, O_CREAT|O_EXCL) 
+0

对不起,但我正在使用ASP.NET –

+0

我可以知道投票的原因吗? –

+0

是的!因为我用C#标记了我的问题,而不是C –