2014-03-07 38 views
0

我在通過ThreadPool.QueueUserWorkItem調用的ASP.NET應用程序中對Web服務進行了冗長的調用。通話需要大約2分鐘才能完成,並向第三方數據存儲發送大約2000條記錄。一切似乎都在順利進行,除了我注意到在運行IIS7的生產環境中進行這些調用時,只有一個CPU正在使用,並且正在被最大化。還有什麼需要做的,以確保線程池將利用所有可用的內核?ThreadPool.QueueUserWorkItem只使用3個核心中的1個

+2

您排隊了2000個項目,還是排隊了一個包含2000個記錄的項目? –

+1

1項包含2000條記錄。由ThreadPool.QueueUserWorkItem調用的方法遍歷2000條記錄,並通過SOAP客戶端和服務引用將每條記錄發送到第三方數據存儲區,這是SOAP調用,它真的讓事情停滯不前。每個記錄僅發送4個字段,並且只包含小字符串和整數。 –

+1

那麼......問題是什麼?你排隊等待1個項目,這意味着你正在進行1個方法調用,你可能不會排隊並簡單地調用它。基本上,你沒有做多線程。 –

回答

3

假設你使用的是.NET 4.0+

如果你有2000條記錄,並需要做出相關的2000調用某種類型的服務,您可以使用此方法:

List<RecordType> records = GetMyRecords(); 
Parallel.ForEach(records, record => { 
    MakeMyServiceCall(record); 
}); 

這將並行運行每個單獨記錄的MakeMyServiceCall方法;並行庫使用場景後面的ThreadPool線程,這些線程將透明地將負載分佈在可用內核上。

+0

這將完全適合我的呼叫外部服務。我還有一個將這些記錄寫入本地數據庫的調用,該數據庫當前正在通過單獨的ThreadPool.QueueUserWorkItem調用完成。我想知道是否可以將Parallel.Foreach應用於此數據庫插入調用而不會創建競爭條件?它寫入一個表,檢索標識,然後寫入相關的表。 –

+0

簡短的回答:是的,你可以使用這個數據庫插入。你如何處理這個問題真的取決於你如何做你的插入:純粹的ADO,EF等 – maf748

相關問題