我有2所DecimalUpDown控制,num_one和num_two,分別綁定到性能第一和第二。當First被更改時,它將聯繫服務器來計算Second的值,反之亦然。觸發服務器調用異步釋放UI,但在快速觸發時(例如滾動輪),最後一個請求並不總是最後一個返回,所以這些值可能會失去同步。無擴展 - 屬性更新對方
利用無我想油門調用只有用戶已經停止生產了一小會兒更改後觸發服務器調用。問題在於,在更新期間進行更改時,屬性更改開始會相互觸發並根據Throttle的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");
}
}
這是完美的,謝謝你。有什麼辦法來限制服務器調用,以便大量的請求不被髮送?我有一個去,但碰到了他們'對戰'相同的問題。 –
在.Select(x => serverCall())之前添加一個.Sample(xxx)似乎有訣竅? –
+1非常好解釋。 – Asti