我有点困惑,因为我很难找到与我的问题相关的任何信息。我对System.Reactive很陌生,所以也许我用错了。
我有许多对象,它们都在事件期间调用静态方法。我想限制对该方法的调用。
public class MyObject
{
public MyObject ()
{
var observable = Observable.FromEventPattern<SizeChangedEventHandler, SizeChangedEventArgs>
(handler => SizeChanged += handler, handler => SizeChanged -= handler);
observable.Throttle (TimeSpan.FromMilliseconds (100));
observable.Subscribe (x =>
{
MethodToCall (this);
});
}
static void MethodToCall (MyObject obj)
{
// Do something.
}
}
现在,这显然不起作用,因为它只会限制来自这个单个对象的调用,这些调用发生的频率远低于 100 毫秒。我认为我需要的是某种静态可观察的,它可以累积所有调用,然后在 100 毫秒后调度调用。谁能给我一些指示?
更新: 我在秒表的帮助下实现了它,它似乎也可以完成这项工作。不过,我仍然对反应式解决方案感到好奇。
private static Stopwatch sw = new Stopwatch();
private static void MethodToCall(MyObjectv)
{
if (sw.ElapsedMilliseconds < 100 && sw.IsRunning)
{
return;
}
// Some code here
if (sw.IsRunning)
{
sw.Restart();
}
else
{
sw.Start();
}
}
您可以在MethodToCall
方法实现中使用可观察量:
private static Subject<MyObject> subject = new Subject<MyObject>();
private static IDisposable subscription = subject
.Throttle (TimeSpan.FromMilliseconds (100))
.Subscribe(v =>
{
// Some code here
});
private static void MethodToCall(MyObject v)
{
subject.OnNext(v);
}
然后,限制成为MethodToCall
的内部实现细节。