仅在使用Rx + WebRequest + XDocument.Load进行修改时检索XDocument

时间:2012-02-06 14:10:58

标签: system.reactive webrequest reactive-programming observable

我有以下两个可观察者

System.Net.WebRequest req = System.Net.HttpWebRequest.Create("http://test.com/data.xml"); req.Method = "HEAD";

var ob = Observable.FromAsyncPattern(req.BeginGetResponse, req.EndGetResponse);

ob().Select(x => x).Select(x => x.Headers["Last-Modified"]).DistinctUntilChanged(x => x);

Observable .Interval(TimeSpan.FromSeconds(1.0)) .Select(_ => XDocument.Load("http://test.com/data.xml"));

我希望XDocument observable仅在“last-modified”标题大于先前请求的文档时执行任何想法?

1 个答案:

答案 0 :(得分:1)

首先。选择(x => x)是一个无操作,所以你可以删除它。

我会稍微改变一下代码。首先让我们把它分解成它的组成部分:

1)计时器。每秒轮询服务器。

var poll = Observable.Interval(TimeSpan.FromSeconds(1));

2)获取标题的调用

var lastModified = Observable.FromAsyncPattern(req.BeginGetResponse,req.EndGetResponse).Select(x => x.Headers [" Last-Modified"]);

3)选择以获取文档

。选择(_ => XDocument.Load(" http://test.com/data.xml"));

我们应该能够很好地构建:

var lastModified = from interval in Observable.Interval(TimeSpan.FromSeconds(1))
           from response in Observable.FromAsyncPattern(req.BeginGetResponse, req.EndGetResponse)
           select response.Headers["Last-Modified"];

var data = lastModified.DistinctUntilChanged().Select(_ => XDocument.Load("http://test.com/data.xml"));

data.Subscribe(dataXml=> 
   {
       Console.WriteLine("Data has changed!");
       Console.WriteLine(datXml);
   });

Cavet我只是直接输入浏览器。如果它编译我会很惊讶。