我目前在C#中使用包含許多視圖/ viewmodels的ReactiveUI構建應用程序。其中一些視圖模型以預設間隔執行網絡請求。這些網絡請求可能隨時失敗。我實現了這個如下:在沒有視圖的ViewModel中處理異常(在ReactiveUI中)
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。有任何想法嗎?
嗨,剛剛出於好奇,爲什麼在處理程序中調用代碼'RefreshError.Handle(ex).Subscribe();'.Subscribe()?如果沒有它,它不會工作嗎? –
.Handle()返回一個冷觀察值。冷觀察者需要使用。訂閱或等待被調用。 (研究這很迷惑,也許這應該在文檔中?) – Wouter