通灵调试请求:'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个项目,但在随后的运行中,一切正常。
你是否已经见过类似的情况,并知道原因是什么?或者想要改变什么/试着找出问题的根源?
所以,在写这个问题的时候,我有了一个(通灵的?)灵感,我已经找到了如何让它工作:
问题是(我认为)由等待数据源隐式调用的初始化引起的延迟-正如您在伪代码中看到的那样,在源启动后发生。
我发现的'修复'是在启动数据源之前执行'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)
所以,这就解释了为什么第一个测试不工作,但我仍然不明白为什么后续的测试之前工作。