Я относительно новичок в ReactiveUI и пытаюсь асинхронно выполнить запрос к базе данных из ReactiveCommand. Из того, что я могу сказать, проблема не в выполнении асинхронного запроса, а в том, что я пытаюсь загрузить результаты в ReactiveList в моей модели представления. Я считаю, что это проблема планирования, но я недостаточно знаком с RxUI, чтобы придумать правильный подход.
Я попытался подписаться на команду в модели представления, используя ObserveOn и с RxApp.TaskPoolScheduler, и с RxApp.MainThreadScheduler, но ни один из них не помог.
Моя модель просмотра:
public class UsersViewModel : ReactiveObject, IRoutableViewModel
{
ReactiveList<LisUser> _users;
IUserManagementService UsersService { get; }
public IScreen HostScreen { get; }
public ReactiveCommand<Unit, IEnumerable<LisUser>> LoadUsers { get; }
public String UrlPathSegment => "users";
public ReactiveList<LisUser> Users
{
get => _users;
set => this.RaiseAndSetIfChanged(ref _users, value);
}
public UsersSubPageViewModel(
IScreen screen,
IUserManagementService usersService)
{
HostScreen = screen ?? throw new ArgumentNullException(nameof(screen));
UsersService =
usersService ?? throw new ArgumentNullException(nameof(usersService));
Users = new ReactiveList<LisUser>();
LoadUsers = ReactiveCommand.CreateFromTask(async () =>
{
return await UsersService.GetUsersAsync().ConfigureAwait(false);
});
LoadUsers
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(list =>
{
Users.Clear();
foreach (var u in list)
{
Users.Add(u);
}
});
}
}
Мой взгляд:
public partial class UsersView : ReactiveUserControl<UsersViewModel>
{
public UsersPageView()
{
InitializeComponent();
this.WhenActivated(disposables =>
{
this.WhenAnyValue(x => x.ViewModel.LoadUsers)
.SelectMany(x => x.Execute())
.Subscribe()
.DisposeWith(disposables);
});
}
}
Я хочу, чтобы при активации UsersView метод GetUsers службы UsersService выполнялся асинхронно и загружал возвращенный список пользователей в список пользователей ReactiveList. Вместо этого я вижу новую вкладку в VS с названием «Source Not Found» и сообщением, что «RxApp.cs not found». Фактическим исключением является System.Exception с сообщением о том, что «Невозможно получить значение локальной переменной или аргумента, потому что оно недоступно по указателю этой инструкции, возможно, потому что оно было оптимизировано».
Итак, мой первый вопрос: "это на самом деле проблема планирования?" И второй вопрос: «Как мне это решить?»