【问题标题】:asp.net generate dynamic thumbnail image concurrency issueasp.net 生成动态缩略图图像并发问题
【发布时间】:2011-08-07 11:45:47
【问题描述】:

这个会很有趣...

看过很多asp.net缩略图生成教程/示例代码,但是没有人考虑过动态生成缩略图时的并发访问问题,当一个或多个用户访问同一个页面时需要生成缩略图。

一个简单的例子,我有一个带有属性图像(房屋等)的站点,图像存储在一个文件夹中,当有人第一次访问特定报价时生成缩略图(用于画廊),然后处理程序从原始较大的图像,处理程序只生成每个缩略图一次,然后在进一步的请求中使用生成的图像。

如果两个用户同时访问此页面会发生什么情况,处理程序可能会在同一个文件上运行两次或更多次,可能会出现并发问题,文件打开错误等(需要打开文件以生成缩略图) .

通常一个用户会得到缩略图,而另一个用户会得到一个没有图像的空白框,直到他们刷新页面(因为第一个用户触发了缩略图创建)

那么问题来了,如何避免这种情况呢?

【问题讨论】:

    标签: c# asp.net concurrency thumbnails


    【解决方案1】:

    通常,如果您只是打开原始图像文件进行阅读以生成缩略图,则同时访问它是没有问题的。多个用户可以同时打开同一个文件进行阅读。如果您同时开始写作,就会出现问题。

    【讨论】:

    • 是和否。是 - 同时写入时可能会出现问题,否 - 缩略图不能 100% 保存,浏览器会同时尝试读取未完全保存的缩略图.另外为了防止并发写入,您需要防止并发打开,我认为答案并不那么简单。
    • @Programista,生成的缩略图是每个用户不同的副本。在这种情况下,唯一的共享资源是文件本身,正如我所说,同时从文件中读取不会造成任何问题。在这种情况下,您永远不会写入相同的共享资源,每个用户向服务器发送请求,服务器读取共享资源并生成写入响应的缩略图。如果另一个用户同时执行相同的请求,将访问相同的共享资源进行读取,将生成相同缩略图的新副本并发送给该用户。
    • 第一个用户对浏览器中的响应做了什么(无论他是否保存了一半)并不重要,也不会干扰第二个用户。如果您的网站允许用户上传您从中生成这些缩略图的文件,则可能会出现问题。在这种情况下,您有两种情况:用户可以更新现有文件,并且用户只能添加新文件。在第一种情况下显然可能存在冲突,而在第二种情况下则不会,因为除非您已将文件存储在服务器上,否则您不会向可能从中生成缩略图的其他用户提供 id。
    • 不,生成的图像对于每个用户都是一样的,问题是当第一个处理程序没有 100% 保存生成的图像时,浏览器可以开始读取生成的图像(除了并发写入)。处理程序检查图像缩略图是否已经生成,但仍然可能存在并发处理程序。
    • @Programista,是的,如果用户可以读取和修改文件等共享资源,则存在冲突。解决此冲突的最佳方法是使用lockReaderWriterLockSlimlock 的性能会更差,因为它只允许单个线程访问共享资源(无论是读取还是写入),而使用 readerwriterlock 您可以允许多个读取器,如果需要写入,它将确保它是同时唯一的一个。
    猜你喜欢
    • 2011-12-21
    • 2019-02-14
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2011-02-10
    • 2013-01-14
    相关资源
    最近更新 更多