1

我有以下兩個觀測使用改性僅當檢索的XDocument RX +的WebRequest + XDocument.Load

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僅執行時「最後修改」報頭是大於以前所要求的文件有什麼想法?

回答

1

首先.Select(x => x)是一個無操作,所以你可以刪除它。

我會改變一點點的代碼。首先讓我們把它分解成它的組成部分:

1)定時器。每秒都輪詢服務器。

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

2)調用來獲取報頭

變種的LastModified = Observable.FromAsyncPattern(req.BeginGetResponse,req.EndGetResponse)。選擇(X => x.Headers [ 「上次修改」]);

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我剛纔輸入的是直接在瀏覽器中。如果它編譯的話我會很棒。