2015-05-08 34 views
4

我有點困惑,我的ASP.NET MVC應用程序將託管在服務器上,那麼是否有任何意義使它成爲多線程?例如,如果我想要一個線程來執行我的翻譯,這是一個好主意嗎?有人可以向我詳細說明這一點嗎?我對Web應用程序多線程與桌面應用程序多線程有點混淆。ASP.NET MVC多線程,值得嗎?

+0

我認爲你會在網上異步執行的很多任務將被AJAX對Web方法的調用取代,全部取決於設計 – user3455363

+0

是的,實際上我在客戶端使用AngularJS,但是後端和MVC代碼,我的擔心。 – AlCode

+0

@ user3455363,但那些AJAX調用將由web服務器處理,所以這不會改變。 –

回答

22

這有幾件事。第一個是每個ASP.NET應用程序(MVC或其他)都是固有的多線程:每個請求將在一個單獨的線程上處理,因此您將自動處於多線程狀態,並且必須考慮共享數據訪問(例如靜態等)。

另一個原因是,與MVC它特別易於編寫異步控制器的方法,如:

public async Task<ActionResult> Index(int id) 
{ 
    var model = await SomeMethodThatGetsModelAsync(id); 
    return View(model); 
} 

現在,如果我們已經多線程又何苦? (有諷刺意味的是,使用更少的線程)。假設SomeMethodThatGetsModel(id)可能會阻塞或以其他方式阻塞該線程,則允許當前線程處理另一個請求。 Web服務器可處理多少個請求的限制之一是它可以處理這些請求的線程數。釋放線程並增加吞吐量。

更進一步的是,您可能希望在整個應用程序的後臺進行一些操作,這裏的原因與桌面應用程序相同。簡而言之,如果您有可以同時完成的工作以及哪些塊(例如,擊中數據庫和兩個Web服務),那麼以多線程方式進行此操作的原因與桌面應用程序相同。 (在最後兩種情況下,請謹慎使用默認的靜態線程池,例如通過ThreadPool.QueueUserWorkItemTask.Run。因爲如果你重擊它,同樣的線程池將用於主ASP.NET線程,重複使用與你的框架相同的板,幾個這樣的用法是絕對好的,但是如果你大量使用單獨的線程,那麼爲它們使用一組單獨的線程,或許使用你自己的池機制)。

+0

好的,謝謝你澄清一些在我腦海中的事情,只有一個問題,有人訪問我的應用程序/網站時使用線程?當新用戶使用它時,他會得到一個單獨的線程或獨立的進程?或者你有這方面的一些文獻,因爲我認爲我需要讀取它有點服務器請求和線程,我有點偏執DDOS:D – AlCode

+1

線程是用於每一個命中,無論是爲ASP.NET頁面或靜態文件有一個線程處理它在服務器上。 (並非所有這些線程都會涉及到.NET線程及其特殊開銷)。當發送響應(同樣,ASP.NET或其他任何東西)時,線程可以自由處理另一個請求,並且如果我們使用'await'(和其他一些可能的方法),則線程可以暫停處理一個請求切換到另一個,所以這種異步使用增加了DOS的難度,儘管它當然不是奇蹟般的治療方法。 –

+0

愚蠢的問題傳入:ASP.NET應用程序爲ASP.NET MVC項目生成的所有控制器方法是否應該轉換爲此類型? – Sinjai

1

有沒有一點讓它多線程?

這是行不通的。問題是:您的應用程序是否需要多線程?例如,如果您收到大型實體的集合,那麼在進一步操作之前需要對其進行預處理,您可以將它們分別處理爲單獨的線程而不是循環。

林有點與網絡應用程式混淆線程多VS桌面應用多在asp.net和桌面穿線

多線程是同樣的事情,並以同樣的方式。

+0

不錯,謝謝你的答案,我的應用程序正在做的唯一的事情就是獲取我的翻譯和用戶登錄/註銷GET和POST請求..但是,這將在AJAX/AngularJS處理 – AlCode