【发布时间】:2017-12-10 15:18:54
【问题描述】:
我目前正在使用包含许多视图/视图模型的 ReactiveUI 在 C# 中构建应用程序。其中一些视图模型以预设的时间间隔执行网络请求。这些网络请求可能随时失败。我是这样实现的:
public ReactiveCommand<Unit, IReactiveList<IJob>> RefreshJobList { get; }
public Interaction<Exception, Unit> RefreshError { get; } = new Interaction<Exception, Unit>();
...
RefreshJobList = ReactiveCommand.CreateFromTask(() => DoNetworkRequest());
RefreshJobList.ThrownExceptions.Subscribe(ex =>
{
log.Error("Failed to retrieve job list from server.", ex);
RefreshError.Handle(ex).Subscribe();
});
Observable.Interval(TimeSpan.FromMilliseconds(300)).Select(x => Unit.Default).InvokeCommand(RefreshJobList);
在对应的视图中,我对异常的处理如下:
this.WhenActivated(d => d(
this.ViewModel.RefreshError.RegisterHandler(interaction =>
{
MessageBox.Show("Failed to load joblist.", "Error", MessageBoxButton.OK);
interaction.SetOutput(new Unit());
})
));
这很好用,除非视图模型与视图没有关联。我的应用程序使用选项卡,当用户切换到不同的选项卡时,之前的视图被破坏。这使得视图模型运行,仍在发出请求,没有视图。然后,当RefreshJobList 发生错误时,没有处理程序与RefreshError 关联,ReactiveUI 会抛出UnhandledInteractionError,我的应用程序崩溃。
我不确定如何干净地处理这个问题。我的第一个想法是暂停 ViewModel 直到附加视图,这也可以节省网络流量。但是,我似乎无法检查 View 是否附加到 ViewModel。有什么想法吗?
【问题讨论】:
标签: c# wpf exception mvvm reactiveui