1

我有以下两个可观察的

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”标头大于先前请求的文档时才执行任何想法?

4

1 回答 1

1

首先 .Select(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)选择获取文档

.Select(_ => 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 我只是直接在浏览器中输入的。如果它编译,我会很惊讶。

于 2012-02-06T19:25:32.347 回答