Я думаю, что Реактивные расширения идеально подходят для этого.
Приведенный выше код, вероятно, вызывается на основе таймера / планировщика, который запускает событие. Вы можете изменить это на реализацию IObservable<T>
, вызвав метод Observable.FromEvent
.
После этого вы можете использовать операторы LINQ на IObservable<T>
, чтобы получить «окна» между нажатиями мыши. Скорее всего, вы бы использовали TakeUntil
метод примерно так:
// Your initial observable.
var timerObservable = Observable.FromEvent(timer, "TimerFired");
// The button pressed.
var pressed = timerObservable.
Where(t => Mouse.GetState().LeftButton == ButtonState.Pressed);
// The button not pressed.
var notPressed = timer.Observable.
Where(t => Mouse.GetState().LeftButton != ButtonState.Pressed);
// Observe the not pressed until it is pressed.
// Make sure to repeat.
var pressed = notPressed.SkipUntil(pressed).Repeat();
Затем можно вызвать метод Subscribe
и передать делегату свой код, который будет вызываться при нажатии кнопки.
Вы даже можете заменить таймер вызовом Observable. Timer
метода , чтобы сгенерировать таймер, который вы ждете.