2015-06-29 79 views
2

所有,C#MVC 4 Mulithreads和Web請求

我創造了我們的MVC 4網站功能,可讓用戶生成PDF報告。這些報告需要幾分鐘時間才能生成,所以我不想讓用戶坐在那裏,同時在狀態窗口中顯示幾個敲門的笑話,這樣我就可以進入創建工作表的傳統路線,輸入工作請求,然後輪詢表格尋找新的工作請求並最終以這種方式生成文件。

我的老闆告訴我只使用多線程方法。換句話說,在第二個線程上分離文件生成任務。有沒有辦法以多線程的方式來做到這一點?我非常確定,由於HTTP請求是無狀態的,一旦用戶通過各種方式終止會話,至少關閉瀏覽器窗口,所有線程將消失或不能保證持久。

我確實試圖找到一個直接的答案,我在MSDN上的簡單問題,但被刪除。我確信這種情況是相同的,不管平臺/框架,只是檢查。

在此先感謝

我是否正確的這個假設?

回答

1

是的,你是正確的,手動創建線程是不正確的做法。

IIS負責管理正在運行的線程,因此它可以隨時回收其應用程序池(並且您當前的線程/工作將會丟失)。您不應該通過創建線程來開始後臺任務。

http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx

另一個偉大的資源:https://github.com/StephenCleary/AspNetBackgroundTasks

TL; DR:

來處理這種情況的可靠方法是複雜的:

  • 添加後臺工作提高到一個可靠的隊列如Azure隊列或MSMQ。
  • 有一個獨立的工作進程來執行隊列中的工作,比如Azure WebJob,Azure工作者角色或Win32服務。
1

其他人已經指出你可以採取一些方向來實現這一點。

第一步肯定要使用異步動作和任務來啓動生成。 無論您想在Web進程內還是在單獨的進程中運行文檔生成都是可擴展性的問題。

像這樣的長時間運行的進程有可能會關閉服務器,除非進行適當的保護和/或限制。

想象一下,如果您的用戶厭倦了等待PDF並重復刷新,會發生什麼情況。下一個用戶有相同的想法(因爲他們總是這樣做)。這可能會淹沒您的服務器,最壞的情況是導致服務器故障。

因此,仔細考慮如何保護您的資源,並在用戶離開時嘗試中止生成。

如果您有一個運行良好的PDF生成器並且用戶數量相對較少,那麼在Web進程內運行文檔生成可能已經足夠好了。如果你期望很多用戶,並需要做一些高級的工作,比如動態擴展雲中的資源,那麼爲單獨的進程排隊任務肯定是一條可行的路。

+0

所有的優點。謝謝 – Slinky