2015-10-01 2 views
1

У меня есть простой наблюдаемый, который отслеживает движение мыши:Как взять интервалы на общее событие, наблюдаемое?

IObservable<EventPattern<MouseEventArgs>> mouseTracker = Observable.FromEventPattern<MouseEventArgs>(form1, "MouseMove"); 
mouseTracker.Subscribe(evt => 
{ 
    rxLabel.Text = evt.EventArgs.Location.ToString(); 
}); 

Как присоединять интервальный метод() для этого наблюдаемого? Все его примеры кода упоминают «Console.WriteLine», что не подходит для этого случая.

IObservable<TimeInterval<long>> observable = Observable.Interval(TimeSpan.FromMilliseconds(750)).TimeInterval(); 
using (observable.Subscribe(
    x => Console.WriteLine("{0}: {1}", x.Value, x.Interval))) 
{ 
    Console.WriteLine("Press any key to unsubscribe"); 
    Console.ReadKey(); 
} 
+0

Что вы подразумеваете под "attach Interval"? вы хотите каким-то образом объединить поток интервалов и поток событий мыши? – Gluck

+0

@ Gluck: да, точно. Я хочу иметь возможность периодически пробовать событие отслеживания мыши. –

+0

И я предполагаю, что оператор [sample] (http://reactivex.io/documentation/operators/sample.html) - это не то, что вы ищете? :) если да, то как? – Gluck

ответ

3

@ Комментарий Глюка. Вы можете использовать Sample для этого. В качестве аргумента может принимать значение TimeSpan или Observable. Первый вариант просто пытается пробовать каждый х промежуток времени. Второй вариант будет пытаться испускать каждый раз при исцелении выборки Observable.

Использование будет выглядеть примерно так:

IObservable<EventPattern<MouseEventArgs>> mouseTracker = 
    Observable.FromEventPattern<MouseEventArgs>(form1, "MouseMove"); 

//Will emit the latest value from mouseTracker, every 750 milliseconds 
IObservable<EventPattern<MouseEventArgs>> sampledTracker = 
    mouseTracker.Sample(TimeSpan.FromMilliseconds(750)); 

sampledTracker 
.ObserveOn(SynchronizationContext.Current) 
.Subscribe(evt => 
{ 
    rxLabel.Text = evt.EventArgs.Location.ToString(); 
}); 

Редактировать

Я добавил код синхронизации, так как выборка будет по умолчанию не оператор в потоке пользовательского интерфейса.

+0

Я хочу, чтобы это было правильным ответом, похоже, что образец ненадежен. Моя форма заморожена через несколько интервалов. Что я сделал не так ? Я использую Rx 2.2.5, .NET 4.5.2. Фрагменты: https://dotnetfiddle.net/mjieU4 –

+0

Проблема, кажется, в вашем коде синхронизации потоков. У Rx уже есть методы для синхронизации с вашим основным потоком, вы не должны сворачивать свои собственные. Это использование 'ObserveOn (SynchronizationContext.Current)' not 'InvokeIfRequired()' – paulpdaniels

Смежные вопросы