2013-10-03 121 views
3

代碼:是否建議爲每個客戶端請求創建線程?

class Controller 
{ 
    Some Action Method() 
    { 
     ... 
     ... 
     new Thread(() => 
     { 
      //WCF cal- wil execute for around 10 secs. 
      var result = service.SubmitAndCreateApp(params); 
      sessionModel.IsAppCreated = result; 
     }).Start(); 

     return jsonresult; 
     } 
} 

由於我的WCF調用花費過多時間,我不希望使用線程池,並使其捱餓。

這裏顯然是爲每個客戶端請求創建線程。我怎樣才能優化這個或任何其他的替代方式來實現.Net 4.0(VS 2010)?

回答

4

不可以。您的服務器將完全獲得DDOS。至少,從線程池請求一個線程,而不是手動創建自己的線程。如果線程池用完,您將等待一個可用。服務器的其餘部分將繼續工作。當然,您的里程可能因許多因素而異。

+0

@ Jesse對於長時間運行的進程,建議使用線程池嗎? –

+0

線程池線程是後臺線程,這意味着在所有前臺線程退出後,它們不會讓應用程序繼續運行。但是,這對您來說可能不是問題,因爲您的WCF請求超時不應超過ASP.NET工作進程的空閒超時。 – Moho

+0

莫霍 - 你的評論似乎並沒有與我的問題相關。對? –

1

每個請求已經得到一個線程,因此通過手動添加另一個線程,你要創建兩個線程每個請求,有效地讓您的服務器能夠請求字段。現在,我不會像其他人那樣具有啓示性:在足夠強大的服務器上,每秒或更多的數據請求不會發生數千次請求,那麼您可能仍然沒問題。不過,這仍然是一個糟糕的設計。

你沒有提到你正在使用什麼版本的C#,但在5.0以上,你現在有async這是你了通常如何處理這種情況:

public async Task<ActionResult> SomeActionWithLongRunningProcess() 
{ 
    await LongRunningProcess(); 

    return View(); 
} 

這將導致.NET卸載請求,釋放線程,直到LongRunningProcess()完成。

+0

其實他*確實*提及他正在使用。NET 4.0/C#4.0,而不是.NET 4.5/C#5.0。 – Servy

+0

你的權利。對不起,我錯過了。但是,對於4.0,如果您想要使用該路線,則可以使用https://www.nuget.org/packages/Microsoft.Bcl.Async添加對aysnc/await的支持。就我個人而言,我會推薦它,因爲手動執行正確的異步操作很難*正確*。 –

+0

儘管如此,他仍然需要C#5.0/VS 2012,他沒有。 – Servy

0

您的代碼可以完成對Some Action Method()的呼叫,並在WCF呼叫完成之前返回jsonresultservice.SubmitAndCreateApp(params)(出於實用目的,假設這將在100%的時間內發生)。如果你想要這樣做,那麼你的代碼很好。但是,如果您需要sessionModel.IsAppCreated服務調用中對您的JSON結果的響應,那麼您的代碼非常糟糕。

要解決此問題,您需要阻止操作方法的線程,直到它創建的線程終止。這個事實以及底層WCF通信通道已經創建了自己的線程來等待來自WCF服務調用的響應這一事實(同步WCF調用實際上只是一個異步調用,直到收到響應爲止)會創建一個新線程無意義。

+0

@ Moho sessionModel.IsAppCreated在我的回覆中不需要 –

+0

這樣的聲音應該是一個web API /服務調用,而不是一個標準的網頁請求。 – Moho

+0

在這種情況下使用TPL或'ThreadPool'不可取,因爲它應該在前臺線程上運行 – Moho

相關問題