WPF Повторно активирует Асинхронный метод, потребляющий

#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% уверен, что делать.

Заранее спасибо за вашу помощь!