如何控制ASP.net应用程序中的资源数量?

问题描述:

我正在研究一个ASP.net应用程序,它基本上使用巨大的Excel文档来做一些计算,并最终从excel中提取输出到页面。正常的Excel文档大小可能超过15 MB。所以我不得不在应用程序上限制它在一个时间点上只能服务5个用户(为了保持内存使用的控制,以便其他Web应用程序在同一台服务器上运行不会受到影响)。因此,所有其他用户必须排队等候才能获得服务。用于计算的Excel在服务器中缓存,当新请求到来时,应用程序将克隆缓存的Excel并将其用于计算。 计算完成后,使用的Excel将被丢弃。 (我不能重用用于其他计算的Excel)如何控制ASP.net应用程序中的资源数量?

所以我的问题是“我们怎样才能限制excel的使用?”。此限制应该是应用程序范围(不是会话范围)。

如果我试图限制对资源的访问,那么我通常会实现对象池模式。这question是一个很好的参考。

+0

谢谢,由于我创建的资源不会重复使用,是否值得使用对象池模式? – KBBWrite

您可以创建应用程序级共享变量(使用静态变量或使用Application State)以保持正在进行的计算计数。不要忘记修改共享状态时的锁定 - 我个人更喜欢使用Interlocked方法提供线程安全的静态变量。

在不同的说明中,我会实际设计不同的解决方案。因为基于excel的计算资源很重,所以我会在不同的过程中移动这个部分(可能是windows服务)。可能会在此过程中托管WCF接受计算请求(请注意请求提交可以通过多种方式完成 - 将请求文件放在某个文件夹中或将行插入数据库表等中)。任何类型的节流都将被放入这个过程中。 ASP.NET应用程序会将请求传递给此服务,并以异步方式更新用户有关结果的信息。

+0

谢谢,现在我已经使用完全相同了,但希望听到有没有更好的方式来做到这一点。 – KBBWrite

+0

@KBBWrite,如编辑中所标记的,我会将计算任务外包给不同的进程/服务。主要优点是Web应用程序不受影响,任务服务(计算部分)可以独立扩展(例如,在多个服务器上运行)。 – VinayC

+0

是的,这是一个完美的方式。但是客户端并不是真的愿意在服务器上托管Windows服务,除非在压力测试中不能真正满足请求的周转时间。所以我在进行一种研发,首先用ASP.net测试它。 – KBBWrite