2013-03-21 32 views
1

时间跨度使用Reactive.NET,我怎么能等到同样的事件,执行操作前发生n秒?等到相同的事件已经发生了使用的Rx

下面的示例(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

为什么不使用任务和任务和ContinueWith()函数?它原产于.NET – David 2013-03-21 12:41:54

+1

我还没有使用的Rx,但你可能想[延迟](http://msdn.microsoft.com/en-us/library/ff708297%28v=VS.92%29.aspx )在“Distinct”之后。 – 2013-03-21 12:45:49

+0

@大卫我到懒得写代码来处理我在寻找延迟,保持后台线程等 – Zurb 2013-03-21 12:58:48

回答

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()两次,我已经与01用它运营商把它贯穿到订阅
  • 相当方便,我们可以使用DistinctUntilChanged阻止重复节点选择事件,如果该节点是一样的
  • 我提出ObserveOn运营商的Throttle电话后,以避免阻塞线程 - ObserveOn的一般准则建议您在订阅之前将其作为最后一位操作员。如果您确实需要使用SynchronizationContext.Current作为tree.GetNodeFromCoordinates(),那么您可能需要切换调度程序几次以避免交叉线程异常。
+0

是的!作品!感谢您的优化! – Zurb 2013-03-21 14:05:42

相关问题