2013-03-21 85 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

相關問題