2011-05-23 81 views
2

上下文:我設置了一個圖片上傳網站。每次用戶上傳照片時,我都需要對這些上傳進行操作。ASP.NET MVC中的後臺線程'job-queue'

在SO的其他用戶的幫助下,我得出結論,我需要一個接受這些「處理工作」的後臺線程,所以我可以快速返回響應給用戶,讓後臺線程工作這些背景工作。

我有點對線程解決方案「設置」,而不是一個服務實例,因爲它不可能爲我設置web服務器上的服務。我已經閱讀了一些關於消息隊列和後臺線程的內容,但是我真的需要的是關於如何繼續的一些實用指針。

另外 - 有什麼我應該知道的事情嗎?在我頭頂,我正在考慮線程的數量,如果線程太多,可能會遇到IIS或服務器的問題?這就是爲什麼我認爲它應該是每個用戶的單個後臺線程,而不是每個工作的線程,因爲可能會一次上傳很多照片。所以每個用戶需要一個線程來照顧像時尚這樣的「隊列」中的工作。我離開基地嗎?

+2

我只是會說,如果你想一個IIS進程你要去陷入困境中做異步工作。服務是你應該使用的,因爲你的web服務器不是銀彈。認爲你的Web服務器是後臺任務的地方是根本錯誤的。 – 2011-05-23 06:58:07

+0

我寧願自己走服務路線,但由於這是不可能的,我不得不考慮線程。 – Dynde 2011-05-23 07:12:32

+0

@Dynde - 你知道線程不是一種選擇,它是生活中的一個事實,你會以任何方式進行線程化。請問爲什麼這是不可能的?爲什麼你不能在Web應用程序中使用Windows服務? – 2011-05-23 07:28:05

回答

1

,你喜歡,你可以運行許多線程,但你會碰到花更多的時間在上下文切換,實際的嘎吱嘎吱的風險。如果您需要良好的CPU性能,則每個CPU內核應該使用不超過1個線程。 PLINQ的東西有這個確切的策略。如果您告訴PLINQ運行查詢,它將並行執行與您的系統上可用的CPU內核數量相等的值。

如果你要實現的隊列,你應該考慮一個FIFO隊列,用戶把他們的工作在一堆線程或服務器從隊列中拉出工作和做的工作。

即可以使用SQL Server數據庫同步使用數據庫FIFO隊列工作跨多臺計算機(這僅僅是你從工作拉一個簡單的表格)。它可以很好地擴展,並且更加強大,因爲如果崩潰或超時,工作可以恢復。

你應該閱讀這question我上發佈有關此而回。 Remus Rusanu在該主題上發佈了一些關於使用數據庫編排工作負載的intresting鏈接。