等到使用Rx在同一事件发生一段时间

时间:2013-03-21 12:40:02

标签: c# winforms events delay system.reactive

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

1 个答案:

答案 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(),那么您可能需要多次切换调度程序以避免跨线程异常。