Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 是否存在一个反应性框架主题,它会一直缓冲,直到它不再';你不需要吗?_.net_System.reactive - Fatal编程技术网

.net 是否存在一个反应性框架主题,它会一直缓冲,直到它不再';你不需要吗?

.net 是否存在一个反应性框架主题,它会一直缓冲,直到它不再';你不需要吗?,.net,system.reactive,.net,System.reactive,当调整第三方库以公开IObservable时,有时不可避免地需要使用ReplaySubject之类的工具,在您意识到流可用后以及在您可以让他人订阅流之前的短时间内缓冲结果 具有较短时间段的ReplaySubject通常会起作用,但并不总是这样,而且会造成浪费,因为一旦订阅者正在侦听,就可能不需要维护滚动队列 是否有一个“主题缓冲直到有人在听”的建议模式?我不确定我是否正确理解了这个问题。但根据您的最后一句主语,它会一直缓冲到有人在听,您可以执行类似下面的扩展方法 static IObservab

当调整第三方库以公开
IObservable
时,有时不可避免地需要使用
ReplaySubject
之类的工具,在您意识到流可用后以及在您可以让他人订阅流之前的短时间内缓冲结果

具有较短时间段的
ReplaySubject
通常会起作用,但并不总是这样,而且会造成浪费,因为一旦订阅者正在侦听,就可能不需要维护滚动队列


是否有一个“主题缓冲直到有人在听”的建议模式?

我不确定我是否正确理解了这个问题。但根据您的最后一句
主语,它会一直缓冲到有人在听
,您可以执行类似下面的扩展方法

static IObservable<T> BufferUntillSubscribe<T>(this IObservable<T> obs)
{
    var replay = new ReplaySubject<T>();
    var disposable = obs.Subscribe(replay);
    return Observable.CreateWithDisposable<T>((subscriber) =>
    {
        disposable.Dispose();
        return replay.Merge(obs).Subscribe(subscriber);
    });
}
static IObservable BufferUntillSubscribe(此IObservable obs)
{
var replay=new ReplaySubject();
var disposable=obs.Subscribe(重播);
返回可观察的。CreateWithDisposable((订户)=>
{
一次性的,一次性的;
返回replay.Merge(obs).Subscribe(订户);
});
}
答案似乎是“否”。您可以自己编写一个,但麻烦相对较小,尽管它看起来很像
ReplaySubject
,只是一个完全在订阅时丢弃队列的对象。从碎片构造一个充满了种族条件


当我编写一个公开
IObservable
的API时,问题就出现了,其中
t连接
有一个成员
IObservable
。观察新的
t连接
的人需要确保他们没有错过该连接上的任何
t消息。潜在的事件源让这有点尴尬。如果观察者不想错过任何消息,我要求他在调用
OnNext(TConnection)
之前订阅
IObservable
。这几乎总是有人想做的,他们只需要确保他们不会为他们的
IObservable
做一些愚蠢的事情,比如
.ObserveOn(Scheduler.TaskPool)
。如果程序员同意这样做,那么实际上根本不需要缓冲(在这个特定的实现中),一个常规的
主题
就可以了。

您能告诉我们为什么认为
重放主题
是浪费吗?你能给我们一个示例代码来演示你想做什么吗?@SebastianGood如果你能订阅一个
ReplaySubject
,为什么你不能同时订阅实际的监听器呢?@IlianPinzon:我们的示例是一个套接字接口。当一个连接被接受时,它本身就是一个可观察的。我们将连接发送给侦听器(例如WhenConnection),然后侦听器订阅消息(例如cxn.WhenMessage)。理想情况下,我们只接受订阅cxn.WhenMessage时的客户端连接,但使用我们的第三方库,我们会立即开始接收消息,并且在侦听器等待订阅时不会丢失消息。@Enigmativity,我只是假设滚动缓冲区的内存开销是可以避免的,因为一旦监听器被订阅,我很乐意让他按照自己的喜好处理缓冲。@SebastianGood-内存开销?除非你正在为Micro.NET框架编程,否则现在这不应该成为一个问题。这只是一个过早优化的例子吗?好主意。为了避免某些竞争条件,可能在
可观察的.Create
委托调用do:
var d=replay.Concat(obs).Subscribe(订阅者)内部;replay.OnComplete();一次性的,一次性的;返回d尽管在完成重播主题后,在Concat订阅hot observable之前,仍然可能丢失消息。