0

Rxフレームワークは非同期操作に非常に役立つように見えますが、多くのページをダウンロードするために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();

もちろん、それは機能しません。それを正しく行う方法は?

4

1 に答える 1

3

編集:簡単なエラー処理を提供するように変更されました。

これがあなたがする必要があることです:

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ます。

于 2012-05-22T01:08:31.893 に答える