以下を例にとります。
var ob = Observable.Interval(TimeSpan.FromSeconds(1)).StartWith(500).Replay(1).RefCount();
ここで達成しようとしているのは、任意の時点でシーケンス内の最新のアイテムの値を「同期的に」取得することです。つまり、次のような拡張機能ではFirstAsync
対応できません。
StartWith
andReplay
ビットは、常に値が存在することを保証します。RefCount
実際のコードでは、処分アクションをいつ実行できるかを検出するためにビットが必要です。
この「任意の時間」部分をシミュレートするために、5 秒後に最新の値を取得してみましょう。
Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(x =>
{
// Try to get latest value from "ob" here.
});
したがって、5秒の遅延5
で、シーケンスから値を取得する必要があります。これらは、これまでに試したものの成功していません。
ob.First()
- 500 を返しますob.Latest().Take(1)
- 同上ob.MostRecent(-1).First()
- 同上ob.MostRecent(-1)
-IEnumerable<long>
「500」でいっぱいですob.Last()
- シーケンスが完了するのを待っているため、戻りません。ob.Latest().Last()
- 同上ob.ToTask().Result
- 同上ob.ToEnumerable()
- 同上ob.MostRecent().Last()
同上
人々が実際にこれを行うことができるリソースはあまりないようです。私が見つけることができる最も近いものはこれです: " Rx: Observable ストリームから最初と最新の値を取得するための演算子" ですが、結局同期呼び出しではない (まだサブスクリプションを使用している) ため、うまくいきません。
これが実際に実行可能かどうかを知っている人はいますか?