Asp.net

Web (asp.net) 環境中長時間執行的操作(執行緒)

  • September 29, 2011

我有一個 asp.net (mvc) 網站。作為功能的一部分,我將不得不支持一些長時間執行的操作,例如:

從使用者發起:使用者可以上傳(xml)文件到伺服器。在伺服器上,我需要提取文件,進行一些操作(插入數據庫)等……這可能需要一分鐘到十分鐘(甚至更長時間 - 取決於文件​​大小)。當然,我不想在導入執行時阻止請求,但我想將使用者重定向到某個進度頁面,他將有機會查看狀態、錯誤甚至取消導入。

此操作不會經常使用,但可能會發生兩個使用者同時嘗試導入數據的情況。並行執行導入會很好。一開始我想在 iis(控制器操作)中創建一個新執行緒並在新執行緒中執行導入。但我不確定這是否是個好主意(在 Web 伺服器上創建工作執行緒)。我應該使用 Windows 服務還是任何其他方法?

從系統啟動: - 我將不得不使用新數據定期更新 lucene 索引。- 我將不得不發送大量電子郵件(將來)。

我應該將其作為站點中的作業實現並通過 Quartz.net 執行作業,還是還應該創建 Windows 服務或其他什麼?

執行站點“作業”時的最佳實踐是什麼?

謝謝!

我會為長時間執行的任務實現獨立的 Windows 服務。Web 應用程序通過隊列方法將長時間執行的任務委託給該服務。如何組織任務隊列取決於您。排隊的任務是否具有優先級、最大執行時間。隊列可以實現為 DBMS 中的普通表,其中包含作業執行狀態資訊屬性(非常簡單的方法)。

所以常見的場景可能如下所示:

  • 客戶端將所有需要的資訊發送到網路伺服器
  • Web 伺服器將任務委託給服務並通知客戶端 - 任務已成功排隊(任務 ID 也發送給客戶端)
  • 外部服務啟動任務處理,更新進度資訊。
  • 客戶端開始輪詢 Web 伺服器,其中包含有關作業(具有較早收到的 id)狀態和進度的簡短執行請求。

您可以選擇不同的技術(Windows 服務 + DB / WCF 服務)和不同的通信方式(輪詢、推送、回調),但我建議將長時間執行的任務委託給外部服務(不要在 Web 應用程序中執行它們)。

執行長時間執行的任務會帶來每個請求執行緒模型(在多執行緒程式術語中)。這種模型具有較差的可擴展性和執行緒池最大執行緒數的限制。不過,這不是你的情況:)

引用自:https://stackoverflow.com/questions/2808678