2013-11-25 49 views
0

我們已經實現了應用程序,其中我們需要處理傳入批次。例如,一組特定對象類型的請求必須發送到特定的web服務以使其處理並行Foreach webservice調用

我們已經實現了以下代碼段來執行此操作。需要你的幫助/指導,如果有wouldbe在同一

var options = new ParallelOptions { MaxDegreeOfParallelism = 10 }; 

Parallel.ForEach(request, options, currentRequest => 
{ 
    ProcessedRequest processedRequest = null; 
    try 
    { 
     currentRequest.DBSave = true; 

     processedRequest = CommunicateToService(currentRequest); 

    } 
    catch (Exception ex) 
    { 

     ExceptionManager.HandleException(ex); 
    } 
}); 

裏面CommunicateToservice方法,我們將調用服務,並通過該請求並得到響應對象,並保存到MS SQL數據庫大約爲10 -15表的任何缺陷。整個方法用AggregateException封裝。

需要輸入如何確定MaxDegreeOfParallelism值。

+0

如果這確實處理了一批相似的項目,那麼您可能希望將該批處理與該服務進行一次通信並讓該服務處理多線程。也許甚至可以使用批處理的sql,因此它在一個單獨的進程中,但仍然比線程更快。線程化,特別是如果每​​個線程都在繁重的工作中,並不比通常的批處理更快。 – nvoigt

+0

Communicatetoservice方法調用外部服務進行響應,並在到達時將其保存到數據庫。我的意思是方法可以處理多線程 – Sarav

+0

也許在一個批處理中發送所有請求會更快,讓他們處理並將它們一次保存到數據庫中。對於大多數數據庫,有非常高效的批處理API,並且您沒有多個服務調用的開銷。但只有你能知道這是否會更快。 – nvoigt

回答

2

對於IO界限的工作,沒有簡單的指導原則。你不知道什麼是最佳吞吐量。測試不同的值並測量哪一個是最快的。

您可能不應該將DOP設置得太高,因爲這可能會使遠程服務超載。

+0

重載遠程服務是在我們的應用程序中發生的事情。我們怎樣才能防止呢?我們正在尋找一種更加保守的方式來擴大同時通話,並在通話超時時縮小規模。對此有何建議? –

+0

@spike你應該問這是一個新問題。聽起來很棒! – usr

+0

完成:http://stackoverflow.com/questions/22656669/prevent-overload-on-remote-system-when-using-parallel-foreach –