用于图像大小调整的Asp.Net异步Http处理程序

时间:2012-05-20 12:10:17

标签: asp.net asp.net-mvc c#-4.0 asp.net-ajax httphandler

我正在使用c#方法Image.GetThumbnail()来生成图像的缩略图。我必须动态生成此缩略图。我必须为单个galleryId生成100个缩略图。所以我添加了一个HttpHandler来动态生成缩略图。问题是当我点击一个库时我有一个100请求进入我的Http处理程序。所以缩略图加载速度非常慢。我有一些问题

  1. 我可以通过Asynchronous Http Handler的实现来提高性能吗?我不熟悉c#中的异步编程。如何使用Http异步处理程序生成缩略图?
  2. 有没有其他方法可以获得比异步编程模型更好的性能?我的意思是添加多个处理程序来提供请求,如
  3. 任何人都可以帮助我。

2 个答案:

答案 0 :(得分:2)

解决这个问题的另一种方法是首先避免它。

上传图像时生成缩略图,然后只提供适当设置了内容到期的就绪缩略图。

您将节省大量处理,更重要的是,及时更改处理,因此当用户查看图库时,您可以尽快提供缩略图。

答案 1 :(得分:1)

在这里,您需要定义延迟的真正问题。是因为你在同一时刻调用它100次,还是因为你的处理程序被会话锁定阻止了?

首先想的是从你的处理程序中删除会话 - 如果你使用它。

其次,如果您的问题是因为您一起多次调用它,则可以使用mutex和一个简单的技巧来限制它。您可以使用mutex锁定处理程序以仅模拟同时创建6个缩略图。

这是一个使用互斥锁的简单代码,可以同时运行n个线程来运行

static var random = new Random(DateTime.Now.Ticks);

public void ProcessRequest_NoCatch (HttpContext context) 
{
    // here we made names like ThubNum_0, ThubNum_1, ThubNum_2 ... ThubNum_4
    //  with 4 you have average 4 simulated thubs
    string sMyMutexName = string.Format("ThubNum_{0}", random.Next(0, 4))

    var mut = new Mutex(true, sMyMutexName);

    try
    {   
        // Wait until it is safe to enter.
        mut.WaitOne();

        // here you create your thubs
    }
    finally
    {
        // Release the Mutex.
        mut.ReleaseMutex();
    }   
}

查看会话如何阻止其他页面: Web app blocked while processing another web app on sharing same session

Replacing ASP.Net's session entirely

缓存

您需要将缩略图缓存到磁盘,并为浏览器的图像设置缓存。没有理由一次又一次地创建它们。