我对Subject类的功能以及何时使用它有一个相当好的想法,但我一直在查看msdn上的语言参考,并看到有各种其他ISubject实现,例如:
由于文档在实地非常薄弱,这些类型的重点是什么,在什么情况下你会使用它们?
Ana*_*tts 23
这些主题都有一个共同的属性 - 他们通过OnNext获取一些(或全部)发布给他们的内容并记录下来并播放给你 - 即他们采取Hot Observable并使其变冷.这意味着,如果您多次订阅这些中的任何一个(即,订阅=>取消订阅=>再次订阅),您将再次看到至少一个相同的值.
ReplaySubject:每次订阅主题时,您都会尽快(或最后n个项目的子集)获取已重播的内容的完整历史记录.
AsyncSubject:始终播放最后发布的项目并完成,但仅在源完成后才播放.这个主题非常适合异步函数,因为您可以编写它们而不必担心竞争条件:即使有人在异步方法完成后订阅,它们也会得到结果.
BehaviorSubject:有点像ReplaySubject但有一个缓冲区,所以你总是得到最后发布的内容.您还可以提供初始值.订阅时,请立即提供一项.
鉴于最新版本(v1.0.2856.0)并为了使这个问题保持最新,有一组新的主题类:
FastSubject
,FastBehaviorSubject
,FastAsyncSubject
和FastReplaySubject
根据他们发布的说明
比常规科目快得多但是:
- 不要通过IScheduler将生产者和消费者分离(有效地将它们限制为ImmediateScheduler);
- 不防止堆栈溢出;
- 不同步输入消息.
如果未指定调度程序,则Publish和Prune运算符将使用快速主题.
关于AsyncSubject
这段代码:
var s = new AsyncSubject<int>();
s.OnNext(1);
s.Subscribe(Console.WriteLine);
s.OnNext(2);
s.OnNext(3);
s.OnCompleted();
Run Code Online (Sandbox Code Playgroud)
打印单个值3.如果订阅在完成后移动,则打印相同.所以它不是第一个,而是最后一个项目,在完成后播放它(直到完成,它不会产生值),并且它在完成之前不像主题那样工作.有关详细信息,请参阅此Prune讨论(AsyncSubject与Prune基本相同)
归档时间: |
|
查看次数: |
1921 次 |
最近记录: |