我會爲該任務使用Rx。
string[] webpages = { "http://www.google.com", "http://www.spiegel.de"};
webpages
.Select(w => FetchWebPage(w))
.ForkJoin()
.Subscribe(x => /*This runs when all webpages have been fetched*/ Console.WriteLine(x));
或者,如果你想控制併發可以同時處理最多4個請求作爲svick建議你可以改成這樣:
Observable.ForkJoin(
webpages
.Select(w => FetchWebPage(w))
.Merge(4))
.Subscribe(x => /*This runs when all webpages have been fetched*/ Console.WriteLine(x));
也neeed一個輔助方法,從普通異步轉換方式到Rx方式
public static IObservable<string> FetchWebPage(string address)
{
var client = new WebClient();
return Observable.Create<string>(observer =>
{
DownloadStringCompletedEventHandler handler = (sender, args) =>
{
if (args.Cancelled)
observer.OnCompleted();
else if(args.Error != null)
observer.OnError(args.Error);
else
{
observer.OnNext(args.Result);
observer.OnCompleted();
}
};
client.DownloadStringCompleted += handler;
try
{
client.DownloadStringAsync(new Uri(address));
}
catch (Exception ex)
{
observer.OnError(ex);
}
return() => client.DownloadStringCompleted -= handler;
});
}
WebClient的作品。 – 2012-07-23 10:56:23
所有這些頁面是來自單個網站還是來自1000個不同的網站? – svick 2012-07-23 11:28:41
@Ramhound我不認爲WebClient本地支持多線程。 – Nick 2012-07-23 11:40:11