RXを使用して、ボタンが接続されている自動化デバイスから発生するイベントを照会しています。ユーザーがボタンを押してすぐに離したときと、ボタンをしばらく押し続けたときの違いを区別できるようにしたいと思います。彼がボタンを押しているかどうかを確認するために使用するクエリに問題があります。
基本的な考え方は、ボタンが押されると、ボタンが再び離されるまで、0.5秒ごとに値を生成するというものです。また、ボタンが押された時間を知るために、各値にタイムスタンプを付けています。
これが私のコードであり、これがどのように機能すると思うかです。
public IObservable<DigitalInputHeldInfo> Adapt(IObservable<EventPattern<AdsNotificationEventArgs>> messageStream) {
var startObservable =
_digitalInputPressedEventAdapter.Adapt(messageStream);
var endObservable =
_digitalInputReleasedEventAdapter.Adapt(messageStream);
return from notification in startObservable.Timestamp()
from interval in
Observable.
Interval(
500.Milliseconds(),
_schedulerProvider.ThreadPool).
Timestamp().
TakeUntil(endObservable)
select new DigitalInputHeldInfo(
interval.Timestamp.Subtract(notification.Timestamp),
notification.Value);
}
与えられたIObservableから、ボタンが押されるたびに値を生成する監視可能なstartObservableを持つようにクエリを適用しています(状態はfalseからtrueになります)。また、同じソースobservableからクエリされたobservable endObservableがあり、ボタンをもう一度離すと値が生成されます(状態がtrueからfalseになります)。startObservableが値を生成するとき、500ミリ秒ごとに監視可能な間隔を開始します。これらの値にタイムスタンプを付け、 endObservableが値を生成するまでそれを取得します。次に、 startObservableの値を保持するオブジェクトを返しますそして今までどれくらいの期間が保持されてきました。
このための単体テストがあり、ボタンを2秒間押し続け(TestSchedulerを使用)、ボタンを放してから、スケジューラーをさらに数秒間続行します。これは、ボタンを離した後に値が生成されないようにするためです。
これは私のテストが失敗するポイントであり、私の質問のトピックです。私のテストでは、4つの値が生成されることを期待しています(0.5秒、1秒、1.5秒、2秒後)。ただし、 TakeUntil(endObservable)を使用している場合でも、ボタンを離した後もイベントが生成されます(endObservableを生成するdigitalInputReleasedEventAdapterには独自のテストセットがあり、正常に機能すると確信しています) 。
クエリを間違って作成したとは思いません。高温と低温の観測量と関係があるのではないかと思います。しかし、私はRXを始めたばかりなので、それが私がここで抱えている問題にどのように関係しているのかを完全には理解していません。