2013-07-01 20 views
1

我正在研究WCF Web服務的性能改進。此Web服務調用可能需要很長時間才能響應的其他Web服務(5秒以上)。由於我們的服務負載很重,所以我們可以體驗到所有線程都被使用的情況,因爲他們正在等待下游服務響應。這導致整個系統備份等。任務<T>實際上是否降低了使用的線程數?

所以我正在研究如果使用WCF異步任務模式將實際上幫助這裏。我真正的問題是調用下游服務的線程究竟發生了什麼,以至於它正在等待響應呢?該線程仍然分配給調用,只是在後臺工作人員池或其他東西?我需要能夠證明,轉向異步任務實際上會降低使用的線程數量,如果這樣做的話。

回答

3

你在這裏想要的是將你的長時間運行的線程返回到線程池並執行所謂的完成來讓該線程接收響應......基本上你的目標應該是讓一個線程處理傳入請求您的服務,然後向長時間等待的外部服務發出呼叫,並立即返回線程池以便其他請求訪問您的服務。然後,在通知第三方服務響應已準備就緒時,它將分配線程池中的或不同線程以獲取響應並對其進行處理。

任務框架更多用於並行化,更少用於基於線程池的完成/拖尾模式。它產生了一個線程來完成一些工作,但除非你手動進行相當先進的干預,否則該線程將不會返回到長時間運行的調用之間的池中。您可以查看的是異步模式調用:開始/結束語法。

http://msdn.microsoft.com/en-us/library/ms228963(v=vs.100).aspx

這些方法/完井將釋放線程池在等待迴應,這應該不含所述緊扣處理更多的服務的調用。

如果您使用的是.NET 4.5,async/await關鍵字對於這種模式來說是一個很好的包裝,您可以使用它們。

+0

更多信息。所以出於好奇,就像一個正在傾聽響應的線程?我的意思是必須打開一個TCP套接字,並繼續聽最後的迴應,對吧?那是什麼?它是否使用單個線程(或固定線程池)在它正在監聽的所有連接之間共享? –

+0

一般來說,這是模式,是的。一個或多個線程共享端口並在一個循環中偵聽,當他們得到響應時,他們立即在線程上旋轉它並返回到偵聽。 – Haney

1

我假設您託管在ASP.NET上。在這種情況下,當方法執行await時,請求線程完全返回到線程池並可自由處理其他請求。

測試最簡單的方法是限制在你的服務器端線程:

int workerThreads, ioThreads; 
ThreadPool.GetMaxThreads(out workerThreads, out ioThreads); 
ThreadPool.SetMaxThreads(Environment.ProcessorCount, ioThreads); 

,並在執行Environment.ProcessorCount + 1同時請求的客戶機測試設置ServicePointManager.DefaultConnectionLimitint.MaxValue

我有這個測試的WebAPI示例here。將其轉換爲WCF示例並不困難。

相關問題