2

定期的にポーリングを続けたいAsyncPatternからオブザーバブルを作成しています。これまでのところ、私はここに到達しました:

var observer = Observable.Defer(ObservableFunc)
    .Concat(Observable.Empty<int>().Delay(TimeSpan.FromSeconds(_pollInterval)))
    .Timeout(TimeSpan.FromSeconds(_Timeout_s))
    .Materialize()
    .Repeat()
    .Publish()
    .RefCount();
  • 誰かがサブスクライブするまでポーリングしないでください(Defer
  • 最後の応答から一定時間後に再ポーリングします(盲目的にポーリングし続けるだけではありません)(Concat/Delay
  • 投票がタイムアウトしたかどうかを検出します(回答なし)(Timeout
  • タイムアウトした場合Repeat再起動してください( )
  • 新規サブスクライバーを再サブスクライブしないでください。サブスクライバーがなくなったらポーリングを停止してください(Publish/RefCount)。

私の質問はMaterializeそこの真ん中についてです。これは(私には)、サブスクライバーがそれについて知ることができるように、TimeoutExceptionを「通過させる」ためのかなりエレガントな方法のようです。として続行するNotificationのか、それともある種のに再実体化するのかがわかりませんMaybe/Nullable T

4

1 に答える 1

1

これは答えとして「適格」ではないかもしれませんが、おそらくコメントには長すぎます...ため息

私の直感によると、タイムアウトをMaybe/として伝播しNullableます。

理由:

  • おそらく、これをサブスクライブしている人は、値を生成できなかった理由が何であるかを気にすることはなく、何らかの理由で次の値が利用できなかったことを気にするだけです。(もちろん、ここでは多くの仮定を立てています)

参考までに、「null 値」(必要に応じて定義 - 、 など) を注入/返す a を使用してTimeout呼び出しを追跡し、結果のストリームの「形状」をサブスクライバーにとってより明確にします。 .CatchMaybeNullable<T>

于 2013-02-11T16:20:13.203 に答える