1

使用 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();
        });
4

1 回答 1

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.Currentfortree.GetNodeFromCoordinates()那么您可能需要切换调度程序几次以避免跨线程异常。
于 2013-03-21T13:54:24.947 回答