【发布时间】:2019-03-15 14:06:15
【问题描述】:
!!警告:Rx 新手!!
我们有多个价格信息。要求是订阅所有这些提要,并且每 1 秒只输出最新的滴答声(节流)
public static class FeedHandler
{
private static IObservable<PriceTick> _combinedPriceFeed = null;
private static double _throttleFrequency = 1000;
public static void AddToCombinedFeed(IObservable<PriceTick> feed)
{
_combinedPriceFeed = _combinedPriceFeed != null ? _combinedPriceFeed.Merge(feed) : feed;
AddFeed(_combinedPriceFeed);
}
private static IDisposable _subscriber;
private static void AddFeed(IObservable<PriceTick> feed)
{
_subscriber?.Dispose();
_subscriber = feed.Buffer(TimeSpan.FromMilliseconds(_throttleFrequency)).Subscribe(buffer => buffer.GroupBy(x => x.InstrumentId, (key, result) => result.First()).ToObservable().Subscribe(NotifyClient));
}
public static void NotifyClient(PriceTick tick)
{
//Do some action
}
}
代码有多个问题。如果我多次使用相同的提要调用 AddToCombinedFeed,则流将开始重复。例如。下面
IObservable<PriceTick> feed1;
FeedHandler.AddToCombinedFeed(feed1);//1 stream
FeedHandler.AddToCombinedFeed(feed1);//2 streams(even though the groupby and first() functions will prevent this effect to propagate further
这让我想到了这个问题。如果我想从合并的流中删除一个价格流,我该怎么做?
【问题讨论】:
-
你一开始就不应该有内部订阅。
-
避免内订阅的原因是什么?
-
因为您最终可能会遇到竞争条件并且很难正确处理内部订阅。可观察管道被设计为自行清理,因此您应该始终编写单个查询而不是多个内部查询。
标签: c# reactive-programming system.reactive