4

RXに頭を包み込もうとしていますが、どこかで脳が爆発します:)

私がやろうとしているのは、RXを介して非同期でWCFメソッドを呼び出すことです。ここでは特別なことは何もありませんが、WCFメソッドがエラーをスローしたときに、チャネルを再作成してもう一度実行します(最大3回)。

私がこれまでに持っているのは:

var _sc = new Service.Service1Client();
var _observableFunc = Observable.FromAsyncPattern<int, string>(_sc.BeginGetData, _sc.EndGetData);
var _observable = _observableFunc(666);

var _defered = Observable.Defer(() => _observable);

// Here something should be done, but don't know what...

using (_retryable.Subscribe(x => Console.WriteLine("Async ==> '{0}'", x),
                            ex => Console.WriteLine("Oops ==> {0}", ex.Message)))
{
    Console.ReadLine();
}

Catch<TSource, TException>いじってみたところ、例外をトラップして同じオブザーバブルを続行できるため、必要なものが得られました。唯一の問題は、それが永久に実行されることです。つまり、例外をスローし続けると、物事が止まることはありません。

4

1 に答える 1

3

これを試してみてください:

var retryable = Observable.Defer(() => _observableFunc(666).Retry(3));

拡張メソッドは、「ソースのRetry監視可能なシーケンスを指定された回数、または正常に終了するまで繰り返します。」

また、これを行わないでください:

var _observable = _observableFunc(666);
var _defered = Observable.Defer(() => _observable);

開始した後、オブザーバブルを延期する意味はありません。

代わりにこれを行う必要があります。

var _defered = Observable.Defer(() => _observableFunc(666));

そうすれば、一番上にある私の提案した解決策からほんの一歩離れたところにいます。

于 2012-09-19T00:31:23.420 に答える