У меня есть два элемента управления DecimalUpDown, num_one и num_two, привязанные к свойствам First и Second соответственно. Когда First изменяется, он свяжется с сервером для вычисления значения Second и наоборот. Увольнение сервера вызывает асинхронное освобождение пользовательского интерфейса, но при быстрой стрельбе (например, колесо прокрутки) последний запрос не всегда является последним для возврата, поэтому значения могут перестать синхронизироваться.Реактивные расширения - Свойства обновляются друг друга
Использование Reactive Я пытаюсь отключить вызовы только для того, чтобы только запустить вызов сервера после того, как пользователь прекратил внесение изменений на некоторое время. Проблема заключается в том, что когда вы делаете изменения во время обновления, изменение свойств запуска запускает друг друга и застревает взад и вперед в зависимости от TimeSpan от Throttle.
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");
}
}
Это замечательно, спасибо.Есть ли способ дросселировать вызовы сервера, чтобы не отправлять много запросов? Я пошел, но столкнулся с той же проблемой, что они «сражались» друг с другом. –
Добавление параметра .Sample (xxx) перед .Select (x => serverCall()), похоже, делает трюк? –
+1 Очень красиво объяснено. – Asti