如何对通用事件进行间隔观察?
How to take intervals on generic Event observable?
我有一个跟踪鼠标移动的简单可观察对象:
IObservable<EventPattern<MouseEventArgs>> mouseTracker = Observable.FromEventPattern<MouseEventArgs>(form1, "MouseMove");
mouseTracker.Subscribe(evt =>
{
rxLabel.Text = evt.EventArgs.Location.ToString();
});
如何将 Interval() 方法附加到此可观察对象?它的所有代码示例都提到 "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();
}
@Gluck 的评论是正确的。您可以使用 Sample
来执行此操作。它可以将 TimeSpan
或 Observable
作为参数。第一个变体只是尝试每隔 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 线程上进行操作。
我有一个跟踪鼠标移动的简单可观察对象:
IObservable<EventPattern<MouseEventArgs>> mouseTracker = Observable.FromEventPattern<MouseEventArgs>(form1, "MouseMove");
mouseTracker.Subscribe(evt =>
{
rxLabel.Text = evt.EventArgs.Location.ToString();
});
如何将 Interval() 方法附加到此可观察对象?它的所有代码示例都提到 "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();
}
@Gluck 的评论是正确的。您可以使用 Sample
来执行此操作。它可以将 TimeSpan
或 Observable
作为参数。第一个变体只是尝试每隔 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 线程上进行操作。