我发现Rx框架看起来对异步操作真的很有用,但我不能理解如何使用它来下载很多页面。
我正在试着写这样的东西
var en = Enumerable.Range(0,100).Select(x => WebRequest.Create("http://google.com")).Select(x => Observable.FromAsyncPattern<WebResponse>(x.BeginGetResponse,
x.EndGetResponse)().Subscribe(r => Console.WriteLine(r.ContentLength)) ).ToList();
当然,它不能工作。怎样做才是正确的?
发布于 2012-05-22 09:08:32
编辑:修改为提供简单的错误处理。
下面是你需要做的:
var urls = new[]
{
"http://stackoverflow.com/questions/10693617/"
+ "rx-framework-for-a-web-crawler",
"http://stackoverflow.com/",
"http://stackoverflow.com/users/259769/enigmativity",
};
Func<string, IObservable<WebResponse>> create =
url =>
Observable.Defer(() =>
{
var wr = WebRequest.Create(url);
return
Observable
.FromAsyncPattern<WebResponse>(
wr.BeginGetResponse,
wr.EndGetResponse)
.Invoke()
.Catch(Observable.Return<WebResponse>(null));
});
var query =
from u in urls.ToObservable()
from r in create(u)
select new
{
URL = u,
ContentLength = r == null ? -1L : r.ContentLength,
};
ServicePointManager.DefaultConnectionLimit = 100;
query.Subscribe(x => Console.WriteLine(x));
不过,我更倾向于提供比这更好的错误处理。我会发送一个包含异常的元组,而不仅仅是一个null
值。
https://stackoverflow.com/questions/10693617
复制相似问题