使用Reactive.NET,如何在执行操作之前等待同一事件发生n秒?
以下示例(C#,WinForms)正在按照我的意愿行事,但在扩展发生之前我想要延迟(比方说1秒):
var autoExpand = Observable.FromEventPattern<DragEventArgs>(tree, "DragOver");
autoExpand
.ObserveOn(SynchronizationContext.Current)
.Distinct(dragEvent => tree.GetNodeFromCoordinates(dragEvent.EventArgs.X, dragEvent.EventArgs.Y))
.Subscribe(dragEvent => {
TreeNode node = tree.GetNodeFromCoordinates(dragEvent.EventArgs.X, dragEvent.EventArgs.Y);
if (node != null) node.Expand();
});
答案 0 :(得分:2)
我相信你正在寻找Throttle
:
var autoExpand = Observable.FromEventPattern<DragEventArgs>(tree, "DragOver");
autoExpand
.Select(dragEvent => tree.GetNodeFromCoordinates(dragEvent.EventArgs.X, dragEvent.EventArgs.Y))
.DistinctUntilChanged()
.Throttle(TimeSpan.FromSeconds(1))
.ObserveOn(SynchronizationContext.Current)
.Subscribe(node => {
if (node != null) node.Expand();
});
注意:
tree.GetNodeFromCoordinates()
次,我已将其与Select
运算符一起使用,以便将其引入订阅DistinctUntilChanged
来阻止重复的节点选择事件ObserveOn
运算符移至Throttle
调用之后以避免阻塞该主题 - ObserveOn
的一般指导原则建议您在订阅之前将其保留为最后一个运算符。如果确实需要SynchronizationContext.Current
使用tree.GetNodeFromCoordinates()
,那么您可能需要多次切换调度程序以避免跨线程异常。