【发布时间】:2012-08-21 15:18:23
【问题描述】:
试图了解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 是:”文本 - 我只看到“值是:”和“Max value is"... 为什么Subject<T> 不推送值到订阅?
案例 2:如果我使用 ReplaySubject<T> - 我确实看到了订阅中的值,但我无法将 Defer 选项应用于任何内容。不是Subject,也不是 Observable....所以每个订阅都会收到不同的值,因为CreateObservable 函数是 cold 可观察的。 Defer 在哪里?
【问题讨论】:
标签: c# system.reactive