2013-03-18 88 views
4

我有一個程序需要從Atom提要中獲取一些數據。我嘗試了兩種方法,但都沒有效果。異步檢索REST服務中的信息,同時限制請求數

我用WebClient同步下載了我需要的所有帖子,但是因爲有幾千個,而且服務很慢,所以需要很多小時。

我試過(第一次)async/await,新的HttpClient和Task.WhenAll。不幸的是,這導致成千上萬的請求觸發服務並導致服務中斷。

我該如何運行100個並行請求?

+0

您是否嘗試過的HttpWebRequest通過BeginGetResponse使用AsyncCallback? – 2013-03-18 17:32:42

+1

這會怎樣幫助我? – TEst16 2013-03-18 17:34:27

+0

從你的問題,我想你想要異步調用?或者你認爲這種技術(Google推薦)也會壓倒服務嗎? – 2013-03-18 17:40:34

回答

2

您可以用ParallelOptions.MaxDegreeOfParallelism

ParallelOptions.MaxDegreeOfParallelism Property

還是一個BlockingCollection使用中並行與有界集合的大小

BlockingCollection Overview

我會建議BlockingCollection

+1

謝謝Blam。 ParallelOptions.MaxDegreeOfParallelism正常工作。在我的情況下,它似乎比異步/等待和HttpClient.GetAsync慢4倍。我猜想與單個IO完成端口線程相比,線程之間的切換比較昂貴。 – TEst16 2013-03-18 19:21:49

+0

試試BlockingCollection。但它可能不會更好。不太確定它是如何處理線程的。對我而言,我喜歡語法。 – Paparazzi 2013-03-18 19:30:25

1

聽起來像你已經有一個解決方案,你可以一次完成很多事情。我建議只在所有帖子中循環添加另一個圖層,但一次只能處理100個圖層。

現在你可能有:DownloadAll(List ListofPosts)DownloadAll你可能會在最後等待。

改爲: For循環從1到(ListofPosts Count/100) DownloadAll(ListofPosts.Skip(xxx).Take(100));

顯然不是真正的代碼,但你可以做幾百塊,對主要功能的改動不大。

+0

如果它是第三方供稿,可能不那麼簡單。如果他們只允許一個「DownloadAll」,不可能但你永遠不知道,你不能真正返回一個子集。 – Justin 2013-03-18 18:11:21

+0

聽起來不太有效。我想隨時下載100個帖子,而不是分批下載。 – TEst16 2013-03-18 18:22:39