我試圖找出爲什麼我試圖建立(使用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的文章,但沒有什麼和我所經歷的一樣。
我已經這樣做了,其實已經確認它不是數據庫。我在運行TPL代碼的同時運行了SQL Profiler,查詢全部執行得很快(0s)。我從不鎖定使用WITH(NOLOCK)選擇的表。我在內部使用標準的ADO.NET SqlCommand和SqlDataReader對象來填充POCO對象。我會再看看數據庫代碼,但我不認爲就是這樣。 – jamauss
什麼樣的類型是ConcurrentBag類型的擴展類型? – Marco
它來自.NET中的System.Collections.Concurrent命名空間 - 它用於線程安全。 – jamauss