1

私は次の2つの観測量を持っています

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は、「最終変更」ヘッダーが以前に要求されたドキュメントよりも大きい場合にのみ実行されるようにしたいと思います。

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 に答える