Reactive Extensions for .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 に解決策があることを期待しています。しかし、どのように?