我有一个Action<Action> operation
它做一些长期运行的工作并通过提供的Action
参数发送心跳。在我调用它之前,我想设置一个IObservable<Unit>
在每次操作发送心跳时产生一个 Next 元素。
我怎么做?
创建IObservable
它并不复杂,但我猜从概念上最简单的方法是从事件创建它,但遗憾的是你不能在方法体中创建事件(除非你知道一种方法)。我可以使用Observable.FromEvent(Action<Action> addHandler, Action<Action> removeHandler)
, 但这需要丑陋的封闭式 Actions 才能将方法调用转发到(参见下面的示例)。
有没有更优雅的方式?
Action forward = null;
Action sendHeartbeat = () => { if (forward != null) forward(); };
//ugly, since it does not scale to multiple observers:
IObservable<Unit> heartbeatObs =
Observable.FromEvent(handler => {
forward = handler;
}, _ => { forward = null; });
operation(sendHeartbeat);
即使我没有使用零维前向动作,而是使用它的集合,它也会很丑陋,因为我将重新实现+=
and-=
运算符EventHandlers
。