編集:簡単なエラー処理を提供するように変更されました。
これがあなたがする必要があることです:
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
ます。