各种ISubject实现做了什么以及何时使用它们?

Jam*_*Hay 26 system.reactive

我对Subject类的功能以及何时使用它有一个相当好的想法,但我一直在查看msdn上的语言参考,并看到有各种其他ISubject实现,例如:

  • AsyncSubject
  • BehaviorSubject
  • ReplaySubject

由于文档在实地非常薄弱,这些类型的重点是什么,在什么情况下你会使用它们?

Ana*_*tts 23

这些主题都有一个共同的属性 - 他们通过OnNext获取一些(或全部)发布给他们的内容并记录下来并播放给你 - 即他们采取Hot Observable并使其变冷.这意味着,如果您多次订阅这些中的任何一个(即,订阅=>取消订阅=>再次订阅),您将再次看到至少一个相同的值.

ReplaySubject:每次订阅主题时,您都会尽快(或最后n个项目的子集)获取已重播的内容的完整历史记录.

AsyncSubject:始终播放最后发布的项目并完成,但仅在源完成后才播放.这个主题非常适合异步函数,因为您可以编写它们而不必担心竞争条件:即使有人异步方法完成订阅,它们也会得到结果.

BehaviorSubject:有点像ReplaySubject但有一个缓冲区,所以你总是得到最后发布的内容.您还可以提供初始值.订阅时,请立即提供一项.


Jam*_*Hay 7

鉴于最新版本(v1.0.2856.0)并为了使这个问题保持最新,有一组新的主题类:

FastSubject,FastBehaviorSubject,FastAsyncSubjectFastReplaySubject

根据他们发布的说明

比常规科目快得多但是:

  • 不要通过IScheduler将生产者和消费者分离(有效地将它们限制为ImmediateScheduler);
  • 不防止堆栈溢出;
  • 不同步输入消息.

如果未指定调度程序,则Publish和Prune运算符将使用快速主题.

  • 这些类已被删除.现在主题默认为"快",并且可以通过调用[`Synchronize`]来添加保护(http://msdn.microsoft.com/en-us/library/hh229016(v = VS.103).aspx) (5认同)

Ser*_*hov 5

关于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基本相同)