首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于web爬虫的Rx框架

用于web爬虫的Rx框架
EN

Stack Overflow用户
提问于 2012-05-22 06:44:04
回答 1查看 431关注 0票数 0

我发现Rx框架看起来对异步操作真的很有用,但我不能理解如何使用它来下载很多页面。

我正在试着写这样的东西

代码语言:javascript
运行
复制
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();

当然,它不能工作。怎样做才是正确的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-22 09:08:32

编辑:修改为提供简单的错误处理。

下面是你需要做的:

代码语言:javascript
运行
复制
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值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10693617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档