2013-04-01 56 views
1

我試圖找出爲什麼我試圖建立(使用TPL)不按預期工作Parallel.ForEach在C#中 - 這是我「米失蹤

這裏的情況:我有一個?一堆服務請求類通過一箇中央服務處理器,然後返回服務結果對象,有時候我需要對這些請求執行多次(我會說在2到5之間)。這樣的:

ServiceRequestType1 Request1 = new ServiceRequestType1(); 
ServiceRequestType2 Request2 = new ServiceRequestType2(); 
ServiceRequestType3 Request3 = new ServiceRequestType3(); 
ServiceRequestType4 Request4 = new ServiceRequestType4(); 

ServiceProcessor sp = new ServiceProcessor(); 

ServiceResultType1 = sp.ProcessType1(Request1); 
ServiceResultType2 = sp.ProcessType2(Request2); 
ServiceResultType3 = sp.ProcessType3(Request3); 
ServiceResultType4 = sp.ProcessType4(Request4); 

// do stuff with the ServiceResult objects... 

這4個請求,我的本地機器上同步運行的時候 - 非常快(通常在每個10毫秒),即使他們正在訪問一個databas所有流程e爲他們的數據。我對這樣的表現感到滿意。隨着時間的推移,隨着數據庫規模的增長和性能的降低,我想知道是否可以使用Parallel.ForEach()並行獲取多個請求並行運行大致相同的時間。

所以我設置像這樣:

ConcurrentBag<ServiceResultBase> results = new ConcurrentBag<ServiceResultBase>(); 

Parallel.ForEach<IServiceRequest>(request.Requests, serviceRequest => 
{ 
    ServiceResultBase serviceResult = ExecuteServiceRequest(serviceRequest); 
    results.Add(serviceResult); 
}); 

正如我一直在測試,問題是,我變得非常不一致的結果。有時候所有的請求都運行得很好,並且所有4個請求總共以10毫秒的時間在<中執行。其他時間一些請求運行在< 10毫秒,但其他時間需要超過3000毫秒,然後有時一個或多個請求運行超過30,000毫秒。有時一個或多個請求根本無法完成。我試圖調試並找到這個根本原因,但到目前爲止,很難分辨問題出在哪裏以及爲什麼Parallel.ForEach對我來說是這樣。

使用.ForEach()時應該注意哪些問題或選項?我在這裏閱讀了一些其他關於TPL的文章,但沒有什麼和我所經歷的一樣。

回答

1

它肯定與TPL無關,問題在於你用來訪問數據庫的庫,或者與數據庫本身有關的表/行鎖相關的某種或併發問題。使用SQL Profiler檢查查詢的執行並從那裏開始。

+0

我已經這樣做了,其實已經確認它不是數據庫。我在運行TPL代碼的同時運行了SQL Profiler,查詢全部執行得很快(0s)。我從不鎖定使用WITH(NOLOCK)選擇的表。我在內部使用標準的ADO.NET SqlCommand和SqlDataReader對象來填充POCO對象。我會再看看數據庫代碼,但我不認爲就是這樣。 – jamauss

+0

什麼樣的類型是ConcurrentBag類型的擴展類型? – Marco

+0

它來自.NET中的System.Collections.Concurrent命名空間 - 它用於線程安全。 – jamauss