2013-10-13 57 views
0

在我的服務器應用程序中,我想處理大量來自客戶端任務的任務。客戶端應用程序提交用於處理和處理每個任務的任務,需要調用Web服務進行預處理,然後纔會進行實際處理。在不阻塞的情況下處理大量需要調用Web服務的任務

我被建議有一個隊列,我將放入服務器接收的所有任務。然後一個線程從隊列中提取任務並調用Web服務。如果在Web服務上阻塞的話,可能會有40個線程執行此操作,其他人也可以執行呼叫,從隊列中拾取項目。在線程接收到來自Web服務的響應後,它將預處理項目放在第二個隊列中,從另一個線程處理另一個線程的任務。並且這個隊列將有1個線程(每個處理器將進一步縮放 - 因此可能是4核心機器上的4個(或更多)線程)。

我相信這可以更有效地完成,無需40個預定義的線程進行Web服務調用,也可能有1個隊列。我認爲有更多的選擇可以讓.NET更高效。有什麼建議麼?

這可能是更廣泛的問題,如何實現更好的這樣一個系統,而不是.net特定。

+0

40 [任務](http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx)不會表示40個物理線程。和/或看看異步/等待。 –

+0

會有數百萬的傳入任務。 40個線程是一種池服務他們。當一個線程阻塞一個長操作時,另一個線程選擇下一個任務。當所有40(N)個線程都被阻塞時 - 處理被阻止。 N有一些實驗值可以找到。 –

回答

2

我認爲你應該瞭解在.net 4.5中可以異步/等待構造。很難說它是否符合你的所有要求,但你應該檢查它。

0

如果出於某種原因,您不符合框架4.5版本的要求,可以將單向WCF調用看作是一種「隨意忘記」方法。

1

我建議您查看TPL Dataflow,該庫允許您爲數據處理定義「流水線」或「網格」,然後通過它來放置數據。 TPL數據流對於異步(例如,web請求)塊和同步(例如處理)塊都非常有效,並且具有許多用於並行的選項。

相關問題