【发布时间】:2019-05-29 15:54:06
【问题描述】:
我对 ReactiveUI 比较陌生,我正在尝试从 ReactiveCommand 异步执行数据库查询。据我所知,问题不在于执行异步查询,而是当我尝试将结果加载到我的视图模型中的 ReactiveList 时。我认为这是一个调度问题,但我对 RxUI 不够熟悉,无法提出正确的方法。
我尝试使用带有 RxApp.TaskPoolScheduler 和 RxApp.MainThreadScheduler 的 ObserveOn 订阅视图模型中的命令,但似乎都没有帮助。
我的视图模型:
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时,UsersService的GetUsers方法异步执行并将返回的用户列表加载到Users ReactiveList中。相反,我在 VS 中看到一个新选项卡,标题为“未找到源”,并显示一条消息“未找到 RxApp.cs”。实际的异常是 System.Exception,其中显示一条消息“无法获取局部变量或参数的值,因为它在此指令指针处不可用,可能是因为它已被优化掉。”
所以,我的第一个问题是“这实际上是日程安排问题吗?”第二个问题是“我该如何解决?”
【问题讨论】:
-
Reactivelist 已被弃用,取而代之的是 DynamicData。没有反应列表的地方是线程安全的
-
感谢您的提示。我在 ReactiveList 上看到过时的警告,但是有这么多新东西,只有这么多的时间来学习。很高兴尽快知道迁移到 DynamicData 的原因
标签: asynchronous command reactiveui