我有以下两个可观察者
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”标题大于先前请求的文档时执行任何想法?
答案 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我只是直接输入浏览器。如果它编译我会很惊讶。