2015-09-03 17 views
1

在我的應用程序中,我有一個文本區域,用戶可以在其中輸入多個網址(通常爲1000左右)。正確的方法來觸發多個HttpWebRequest,可能需要很長時間

每個網址,我火了一個http請求是這樣的:

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
HttpWebResponse response = request.GetResponse() as HttpWebResponse; 

問題: 常常URL服務器處於脫機狀態,這意味着request.GetResponse()將掛起request.Timeout毫秒。 我需要系統不忍受等待超時;相反,我想利用空閒時間來激發剩餘的請求,同時某個請求正在等待響應。

我的解決方案 我雖然對調度每個請求在不同的任務 我的解決方案,因此,看起來是這樣的:

Task[] tasks = new Task[numberOfUrls]; 
for (int i = 0; i < numberOfUrls; ++i) 
{ 
    int index = i; 
    tasks[index] = Task.Factory.StartNew(() => Request(urls[index])); 
} 

Task.WaitAll(tasks); 

問:什麼是做解決這個問題的正確方法?

我不知道我的方法是正確的方式,因爲閱讀了大量的材料對整個C#異步/多線程/並行機制(這我不是很熟悉了)後,我真的很困惑。 在這一點上,我不確定我是這樣做異步或多線程或任何。 我看到了一些建議,我應該讓這種方法觸發請求async,他們稱之爲等待。但後來我也發現有人說它不會利用並行性等等。

我預計人們會基於這標誌着作爲的意見,但我希望你想象的更難,因爲它確實不是:它是關於正確使用基於它是如何工作的,並應該使用的框架。

回答

0

這裏重要的是你需要並行發出一定數量的HTTP請求。總是有很多優秀的。這是你在這裏獲得的表現。

您使用的技術並不重要。

我會做的是使用異步IO的HTTP請求和使用one of the common techniques of processing a list of items in parallel asynchronously

你可能應該使用現代的HttpClient類,它很好地與await一起工作。但這並非嚴格要求。

通過實驗確定並行度。


public static Task ForEachAsync<T>(this IEnumerable<T> source, int dop, Func<T, Task> body) 
{ 
    return Task.WhenAll( 
     from partition in Partitioner.Create(source).GetPartitions(dop) 
     select Task.Run(async delegate { 
      using (partition) 
       while (partition.MoveNext()) 
        await body(partition.Current); 
     })); 
} 
相關問題