次
:
// The initial Uri
Uri initialUri = ...;
// A function to return the JSON string from a given Uri
Func<Uri, string> getJason = ...;
// Turn the JSON into the next set of Uris to fetch
Func<string, IEnumerable<Uri>> getUris = ...;
次に、Rxを使用して、これらの関数を、タスクプールを使用してオブザーバブルを返す関数に変換します。
Func<Uri, IObservable<string>> getJasonObsFunc = u =>
Observable
.FromAsyncPattern<Uri, string>(
getJason.BeginInvoke,
getJason.EndInvoke)
.Invoke(u)
.ObserveOn(Scheduler.TaskPool);
Func<string, IObservable<Uri>> getUrisObsFunc = j =>
Observable
.FromAsyncPattern<string, IEnumerable<Uri>>(
getUris.BeginInvoke,
getUris.EndInvoke)
.Invoke(j)
.ObserveOn(Scheduler.TaskPool)
.SelectMany(xs => xs.ToObservable());
コールバックを取得するにはコールバックが必要ですUri/JSONはペアになっています。このような何か:
var subscription = getAllUris(initialUri).Subscribe();
:
Func<Uri, IObservable<Uri>> getAllUris = null;
getAllUris = u =>
Observable
.Return<Uri>(u)
.Merge(
from j in getJasonObsFunc(u).Do(k => callback(u, k))
from u1 in getUrisObsFunc(j)
from u2 in getAllUris(u1)
select u2);
は、その後、あなたが次の行を使用して、この良さのすべてを呼び出す
:ここ
Action<Uri, string> callback = (u, j) =>
Console.WriteLine(String.Format("{0} => {1}", u, j));
は再帰的に各JSON文字列を取得します再帰的なLINQクエリですクエリの実行をキャンセルする場合は、次のように呼び出します:
subscription.Dispose();
Rxはすべてのタスクを処理し、すべてのタスクをキャンセルします。
こちらがお役に立てば幸いです。ここで
はRxのためのリンクです: