私の質問は、Rxとキャッチ演算子に関係します。私は観測可能でタイムアウトがあり、タイムアウトが発生するたびに根底にある観測可能なもの(Catch)を再作成し、同じことを行う(タイムアウトとキャッチを追加する)とします。反応抑制の無限のキャッチ
以下にサンプルコードを貼り付けました。この例では、タイムアウトは2秒ごとに発生します。私の観察から、このコードは無限に働くことはできません。何らかの形でレクリエーションの後、何かが古い観測可能な残余物を参照しています。これらの残余は、キャッチが呼び出されるたびに蓄積されます。
ほとんどの疑わしい行が最後のものであり、何らかの自己参照が存在します。しかし、なぜそれが間違っているのか、私は実際に自分自身を視覚化することはできません。また、永遠に動作する同様のロジックで観測可能なものを作成する方法はありますか?
public static IObservable<string> CreateReliableStream(this IObservable<string> targetObservable, Func<IObservable<string>> recreateObservable)
{
return targetObservable
.Timeout(TimeSpan.FromSeconds(2))
.Catch<string, Exception>(exception => ReconnectOnError(exception, recreateObservable));
}
private static IObservable<string> ReconnectOnError(Exception exception, Func<IObservable<string>> recreateObservable)
{
GC.Collect(); // For debug - make sure all unreferenced object are removed
return recreateObservable()
.Timeout(TimeSpan.FromSeconds(2))
.Catch<string, Exception>(ex => ReconnectOnError(ex, recreateObservable));
}
ように見える終わるかもしれないあなたのコードは、これは.NETの質問やJavaの質問ですか?私はrx-javaタグで混乱しています... –
これはrx-netとrx-javaがうまくいくのでRx質問です。コード例はC# –