2つのDecimalUpDownコントロール、num_oneとnum_twoがあり、それぞれプロパティFirstとSecondにバインドされています。Firstが変更されると、サーバーに接続してSecondの値を計算し、その逆も同様です。サーバー呼び出しを非同期で起動するとUIが解放されますが、すばやく起動すると(たとえば、スクロールホイール)、最後の要求が常に最後に返されるとは限らないため、値が同期しなくなる可能性があります。
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");
}
}