2011-02-07 111 views
4

我正在尋找使用Parallel.For來調用需要一段時間才能返回的Web服務,但是,我們知道我們可以同時多次調用它,並且不會花費太多時間單一電話。從Parallel.For獲取結果

爲此,我嘗試了Parallel.For,我真的想檢查我的想法如何工作。我可能會有些過於謹慎,因爲我不想搞砸這個應用程序,我想確保如果我們走這條路線,整個應用程序團隊都會知道訪問並行代碼時需要做什麼。

無論如何,這裏是我目前的工作和理解。

public IEnumerable<HotelAvail> GetAvailability (IList<string> codes, DateTime startDate, int numNights) 
{ 
    HotelAvail[] result = new HotelAvail[codes.Count]; 

    Parallel.For(0, codes.Count, i => 
     { 
      string code = codes[i]; 
      result[i] = new AvailService(). 
       GetAvailability(
        code, startDate, numNights); 
     }); 

    return result; 
} 

AvailService得到房間給一個指定的日期範圍(startDate + numNights)的可用性。 code是屬性的標識符。

我在開始時設置了大量空槽的正確大小的結果數組。

然後我並行地調用服務。該服務會創建一個新的對象,並將其放置在陣列中正確的位置。

當一切完成後,我返回數組。它應該在這一點上被充分填充。應該沒有空白。該服務不會影響系統狀態的任何其他部分 - 它只是建立一個Web服務調用,調用它,並返回一個結果對象。

有沒有這個問題,我沒有看到。

就像我上面說過的,我可能過於謹慎了,但在更年輕和旺盛的日子裏我寫了多線程代碼,我不想再犯同樣的錯誤。

此外,這段代碼最終將在ASP.NET應用程序中結束。我隱約記得,它抱怨了很多關於多線程代碼。我可能在那裏遇到任何其他問題?

回答

3

看起來沒給我,但我認爲PLINQ會多一點優雅:

public IEnumerable<HotelAvail> GetAvailability (IList<string> codes, 
                DateTime startDate, 
                int numNights) 
    { 
     return codes.AsParallel().AsOrdered().Select(code => 
       new AvailService().GetAvailability(code, startDate, numNights)) 
       .ToList(); 
    } 
1

對於Asp.net問題,如果您的方法調用不能很快返回,您可能會很快遇到應用程序超時。您可能想要爲此場景執行的操作是爲每個代碼調用一個使用AJAX的方法,當您的Web服務調用完成時返回一個HotelAvail對象,並在可用時使用新信息更新UI。

+0

這部分是我想要使用的Parallel.For如果我必須做出10個服務電話的原因,每個大約需要4到7秒才能返回,然後是40到70秒來獲得這些數據。如果我可以平行打電話,結果是每次通話平均6-9秒,但我可以一次打5個電話,然後是12到18秒。顯着的節約。 – 2011-02-07 15:56:16