如何在通用事件可观察对象上取间隔

本文关键字:对象 观察 事件 | 更新日期: 2023-09-27 18:15:34

我有一个简单的可观察对象来跟踪鼠标移动:

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

如何附加Interval()方法到这个可观察对象?它的所有代码示例都提到了"控制台"。

不适合这种情况。
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();
}

如何在通用事件可观察对象上取间隔

@Gluck的评论是正确的。你可以用Sample来做这个。它可以取TimeSpanObservable作为参数。第一种变体只是尝试每x次采样一次。第二个变体将尝试在每次采样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();
});

编辑

我添加了同步代码,因为示例默认不会在UI线程上操作。