我想充分利用.NET (Rx) 的反应式扩展,并希望获得一些关于执行一些基本任务的输入。为了说明我想要做什么,我有一个人为的例子,我有一个带有异步事件的外部组件:
class Component {
public void BeginStart() { ... }
public event EventHandler Started;
}
该组件通过调用启动BeginStart()
。此方法立即返回,稍后,当组件完成启动时,将触发该Started
事件。
我想通过包装组件来创建一个同步启动方法并等待Started
事件被触发。到目前为止,这是我想出的:
class ComponentWrapper {
readonly Component component = new Component();
void StartComponent() {
var componentStarted =
Observable.FromEvent<EventArgs>(this.component, "Started");
using (var startedEvent = new ManualResetEvent(false))
using (componentStarted.Take(1).Subscribe(e => { startedEvent.Set(); })) {
this.componenet.BeginStart();
startedEvent.WaitOne();
}
}
}
我想摆脱ManualResetEvent
,并且我希望 Rx 有一个解决方案。但是怎么做?