我有一个'热门'数据源,它会公开一个包含我感兴趣的数据的事件。
我创建了一个'包装器',它使用Observable.FromEventPattern
将我的数据源公开为Observable。
我遇到的问题是使用包装器,我总是丢失前几个数据项,但只运行第一次时间。
部分代码:
在内部,Wrapper类使用RoutedObservable
(this的后继者)来允许订阅者在Source连接之前“注册”。
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(); }
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
属性被Source重新初始化为零
首次运行时,_list
在开始时缺少大约8个项目,但在后续运行中,一切正常。
您是否已经看过类似的内容,并了解原因可能是什么?或者想知道要改变什么/试图解决问题的来源?
答案 0 :(得分:0)
所以,在写这个问题时,我有一个(通灵?)灵感,我已经找到了如何让它发挥作用:
问题是(我认为)由初始化引起的延迟,这是由等待数据源隐式调用的 - 正如你在伪代码中看到的那样,在源启动后发生。< / p>
我发现'修复'是在启动数据源之前执行'虚拟'订阅(我的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)
所以,这解释了为什么第一次测试不起作用,但我仍然不明白为什么以后的测试 以前正在工作。