通灵调试请求:'spin up'Observable.FromEventPattern

本文关键字:up Observable FromEventPattern spin 调试 请求 通灵 | 更新日期: 2023-09-27 18:11:26

我有一个'hot'数据源,它公开了一个包含我感兴趣的数据的事件。

我已经创建了一个'包装器',它使用Observable.FromEventPattern将我的数据源作为一个可观察对象。

我遇到的问题是使用包装器,我总是丢失前几个数据项,但只有第一个时间我运行它。

一些代码:

在内部,Wrapper类使用RoutedObservable(它的后继)来允许订阅者在Source连接之前"注册"。

Wrapper.cs

RoutedObservable<Data> _Data = new RoutedObservable<Data>;
_Data.SetSource(Observable.FromEventPattern<EventArgs<Data>>
     (
         h => _Source.DataReceived += h,
         h => _Source.DataReceived -= h 
     )
     .Select(e => e.EventArgs.Data));
public IObservable<Data> Data { get { return _Data.Publish().RefCount(); } }
public void Start { _Source.Start(); }
public void Stop { _Source.Stop(); }

Test.cs

var _list = new List<Data>();
_Wrapper.Start();
var lastData = await _Wrapper.Data
             .Do(_list.Add)
             .Select(SomeConversion)
             .Take(NumberOfSamples)
             .LastAsync();
//Check lastData.Id == NumberOfSamples
// (give or take an off-by-one error)
//if Check not OK, have a look inside _list too see what's missing
_Wrapper.Stop();

(Data.Id属性在每次停止/启动时由源重新初始化为零)

第一次运行时,_list在开始时丢失了大约8个项目,但在随后的运行中,一切正常。

你是否已经见过类似的情况,并知道原因是什么?或者想要改变什么/试着找出问题的根源?

通灵调试请求:'spin up'Observable.FromEventPattern

所以,在写这个问题的时候,我有了一个(通灵的?)灵感,我已经找到了如何让它工作:

问题是(我认为)由等待数据源隐式调用的初始化引起的延迟-正如您在伪代码中看到的那样,在源启动后发生

我发现的'修复'是在启动数据源之前执行'dummy'订阅(我的Observable是Publish().RefCount() ed)。

Create wrapper (creates data source and Observable)
empty Subscribe to observable <--------------
Start data source
await n data samples
Stop data source
Check sample[0] id == 0
Destroy wrapper (implicitly: leaves scope)

所以,这就解释了为什么第一个测试不工作,但我仍然不明白为什么后续的测试之前工作。