2013-05-26 38 views
2

我正在一個更大的網站上工作,並且我想在分開的線程上運行程序的「長時間運行」部分。 但我對如何做到這一點很感興趣,雖然我會問是否有人解決了類似的問題。我想這樣做的原因是因爲我發送電子郵件給用戶,並且在發送電子郵件之前有相當多的數據庫查找,所以在發生這一切時不需要鎖定用戶。還有其他一些情況下,我想等一段時間發送電子郵件,以防萬一發送更多電子郵件,然後再合併它們。ASP.NET MVC和backgorund進程之間的通信

我已經想到了2種方法來做到這一點:

  1. 具有在應用程序狀態啓動,這 然後將運行後臺處理的線程運行。這將使我能夠將 對象直接發送到該線程。
  2. 有一個程序運行在側面, 並通過我的數據庫中的表發送數據給它。
+0

異步........? – Shyju

回答

2

使用一個後臺進程做需要做任何繁重的工作。不要在你的動作方法中做這件事,也不要在你的動作方法中產生一個線程來完成這項工作:如果你在同一時間得到很多活動,就會冒許多線程的風險。

如果可以,我建議使用Windows服務來完成後臺任務。這樣,如果需要,它可以運行在另一臺計算機上,而不是您的Web應用程序。

使用數據庫存儲有關要完成的後臺工作的信息,但不要將數據庫表用作「工作隊列」。使用應該是一個適當的隊列:

  • 亞馬遜SQS
  • Azure的消息總線
  • 的RabbitMQ

所以,你的操作方法將使所需的後臺任務中的數據在數據庫中,然後會在你的隊列中推送一條消息說要完成這項工作。您的後臺任務會將消息從隊列中彈出並訪問數據庫以獲取工作數據。

請參見: