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オペレーターを呼び出しの後に移動しました。一般的なガイドラインでは、サブスクリプションの前に最後のオペレーターとして残すことをお勧めします。forを使用する必要がある場合は、クロススレッドの例外を回避するためにスケジューラを数回切り替える必要がある場合があります。ThrottleObserveOnSynchronizationContext.Currenttree.GetNodeFromCoordinates()
于 2013-03-21T13:54:24.947 に答える