2011-11-16 79 views
0

我正在研究一個ASP.net應用程序,它基本上使用巨大的Excel文檔來做一些計算,並最終從excel中提取輸出到頁面。正常的Excel文檔大小可能超過15 MB。所以我不得不在應用程序上限制它在一個時間點上只能服務5個用戶(爲了保持內存使用的控制,以便其他Web應用程序在同一臺服務器上運行不會受到影響)。因此,所有其他用戶必須排隊等候才能獲得服務。用於計算的Excel在服務器中緩存,當新請求到來時,應用程序將克隆緩存的Excel並將其用於計算。 計算完成後,使用的Excel將被丟棄。 (我不能重用用於其他計算的Excel)如何控制ASP.net應用程序中的資源數量?

所以我的問題是「我們怎樣才能限制excel的使用?」。此限制應該是應用程序範圍(不是會話範圍)。

回答

0

如果我試圖限制對資源的訪問,那麼我通常會實現對象池模式。這question是一個很好的參考。

+0

謝謝,由於我創建的資源不會重複使用,是否值得使用對象池模式? – KBBWrite

1

您可以創建應用程序級共享變量(使用靜態變量或使用Application State)以保持正在進行的計算計數。不要忘記修改共享狀態時的鎖定 - 我個人更喜歡使用Interlocked方法提供線程安全的靜態變量。

在不同的說明中,我會實際設計不同的解決方案。因爲基於excel的計算資源很重,所以我會在不同的過程中移動這個部分(可能是windows服務)。可能會在此過程中託管WCF接受計算請求(請注意請求提交可以通過多種方式完成 - 將請求文件放在某個文件夾中或將行插入數據庫表等中)。任何類型的節流都將被放入這個過程中。 ASP.NET應用程序會將請求傳遞給此服務,並以異步方式更新用戶有關結果的信息。

+0

謝謝,現在我已經使用完全相同了,但希望聽到有沒有更好的方式來做到這一點。 – KBBWrite

+0

@KBBWrite,如編輯中所標記的,我會將計算任務外包給不同的進程/服務。主要優點是Web應用程序不受影響,任務服務(計算部分)可以獨立擴展(例如,在多個服務器上運行)。 – VinayC

+0

是的,這是一個完美的方式。但是客戶端並不是真的願意在服務器上託管Windows服務,除非在壓力測試中不能真正滿足請求的週轉時間。所以我在進行一種研發,首先用ASP.net測試它。 – KBBWrite

相關問題