Subject<T>
、ReplaySubject<T>
およびその他の機能の仕組みを理解しようとしています。次に例を示します。
(サブジェクトは観察可能で観察者です)
public IObservable<int> CreateObservable()
{
Subject<int> subj = new Subject<int>(); // case 1
ReplaySubject<int> subj = new ReplaySubject<int>(); // case 2
Random rnd = new Random();
int maxValue = rnd.Next(20);
Trace.TraceInformation("Max value is: " + maxValue.ToString());
subj.OnNext(-1); // specific value
for(int iCounter = 0; iCounter < maxValue; iCounter++)
{
Trace.TraceInformation("Value: " + iCounter.ToString() + " is about to publish");
subj.OnNext(iCounter);
}
Trace.TraceInformation("Publish complete");
subj.OnComplete();
return subj;
}
public void Main()
{
//
// First subscription
CreateObservable()
.Subscribe(
onNext: (x)=>{
Trace.TraceInformation("X is: " + x.ToString());
});
//
// Second subscribe
CreateObservable()
.Subscribe(
onNext: (x2)=>{
Trace.TraceInformation("X2 is: " + x.ToString());
});
ケース 1: 奇妙な状況はSubject<T>
、サブスクリプションが作成されていない場合 (???) - 「X is:」というテキストがまったく表示されない - 「Value is:」と「Max value is」のみが表示される...Subject<T>
がサブスクリプションに値をプッシュしないのはなぜですか?
ケース 2: 使用する場合- サブスクリプションに値が表示されますが、オプションを何にもReplaySubject<T>
適用できませんでした。Defer
オブザーバブルではありませSubject
ん....CreateObservable
関数はコールドオブザーバブルであるため、すべてのサブスクリプションは異なる値を受け取ります。はどこDefer
ですか?