Реактивные расширения — свойства обновляют друг друга

У меня есть два элемента управления DecimalUpDown, num_one и num_two, привязанные к свойствам First и Second соответственно. При изменении First он свяжется с сервером, чтобы вычислить значение Second, и наоборот. Запуск серверных вызовов асинхронно освобождал пользовательский интерфейс, но при быстром запуске (например, колесико прокрутки) последний запрос не всегда является последним для возврата, поэтому значения могут стать несинхронизированными.

Используя Reactive, я пытаюсь регулировать вызовы, чтобы вызывать сервер только после того, как пользователь на некоторое время прекратил вносить изменения. Проблема в том, что когда вы вносите изменения во время обновления, изменение свойств начинает запускать друг друга и застревает взад и вперед в зависимости от TimeSpan дроссельной заслонки.

    public MainWindow()
    {
        InitializeComponent();

        DataContext = this;

        Observable.FromEventPattern<RoutedPropertyChangedEventHandler<object>, RoutedPropertyChangedEventArgs<object>>(h => num_one.ValueChanged += h, h => num_one.ValueChanged -= h)
            .Throttle(TimeSpan.FromMilliseconds(100), Scheduler.ThreadPool)
           .Subscribe(x =>
           {
               Thread.Sleep(300); // simulate work
               Second = (decimal)x.EventArgs.NewValue / 3.0m;
           });

        Observable.FromEventPattern<RoutedPropertyChangedEventHandler<object>, RoutedPropertyChangedEventArgs<object>>(h => num_two.ValueChanged += h, h => num_two.ValueChanged -= h)
            .Throttle(TimeSpan.FromMilliseconds(100), Scheduler.ThreadPool)
           .Subscribe(x =>
           {
               Thread.Sleep(300); // simulate work
               First = (decimal)x.EventArgs.NewValue * 3.0m;
           });
    }

    private decimal first;
    public decimal First
    {
        get { return first; }
        set
        {
            first = value;
            NotifyPropertyChanged("First");
        }
    }

    private decimal second;
    public decimal Second
    {
        get { return second; }
        set
        {
            second = value;
            NotifyPropertyChanged("Second");
        }
    }
5
задан Wladimir Palant 28 June 2012 в 18:35
поделиться