#c# #wpf #async-await #reactiveui
Вопрос:
Я пытаюсь найти подходящее решение в ReactiveUI для следующей модели представления.
private A _selectedA;
private DateTime _startDateTime;
private DateTime _endDateTime;
public ObservableCollection<A> aList { get; }
public A selectedA
{
get { return _selectedA; }
set { this.RaiseAndSetIfChanged(ref _selectedA, value); }
}
public DateTime startDateTime
{
get { return _startDateTime; }
set { this.RaiseAndSetIfChanged(ref _startDateTime, value); }
}
public DateTime endDateTime
{
get { return _endDateTime; }
set { this.RaiseAndSetIfChanged(ref _endDateTime, value); }
}
public ObservableCollection<B> bList { get; }
public async Task<Unit> populateBListAsync()
{
// Do long-running bList population here.
return Unit.Defau<
}
bList
определяется startDateTime
, endDateTime
, и selectedA
. (т. е. Все, что находится внутри bList
, является функцией этих свойств).
Существует вероятность того, что любое из этих свойств может измениться одновременно при использовании представления, но я не хочу запускать одно и то же длительное выполнение populateBListAsync()
более одного раза и до тех пор, пока все свойства не будут установлены.
Я попробовал следующие подписчики, и оба, кажется, работают. Моя проблема в том, что я не уверен, какой из них «правильный».
Я думаю, что этот выбирает «Последний» из вызовов асинхронного метода.
this.WhenAnyValue(x => x.startDateTime, x => x.endDateTime, x => x.selectedA)
.ObserveOnDispatcher() // Necessary for some UI functionality.
.SelectMany(x => populateBListAsync())
.LastOrDefaultAsync() // This seems to pick the last of the method calls, but I can't be sure.
.Subscribe();
Этот «ждет» определенное время, пока все обновится перед запуском.
this.WhenAnyValue(x => x.startDateTime, x => x.endDateTime, x => x.selectedA)
.Throttle(TimeSpan.FromMilliseconds(100)) // Wait until all updates have finished, then run.
.ObserveOnDispatcher() // Necessary for some UI functionality.
.SelectMany(x => populateBListAsync())
.Subscribe();
Я все еще относительно новичок в RX и реактивном пользовательском интерфейсе, поэтому я не на 100% уверен, что делать.
Заранее спасибо за вашу помощь!