心理调试请求:Observable.FromEventPattern'旋转'

时间:2014-07-03 06:51:10

标签: c# system.reactive

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

我创建了一个'包装器',它使用Observable.FromEventPattern将我的数据源公开为Observable。

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

部分代码:

在内部,Wrapper类使用RoutedObservablethis的后继者)来允许订阅者在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属性被Source重新初始化为零

首次运行时,_list在开始时缺少大约8个项目,但在后续运行中,一切正常。

您是否已经看过类似的内容,并了解原因可能是什么?或者想知道要改变什么/试图解决问题的来源?

1 个答案:

答案 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)

所以,这解释了为什么第一次测试不起作用,但我仍然不明白为什么以后的测试 以前正在工作。