我正在尝试学习如何最好地使用反应式扩展库,并设置了简单的测试 WPF 应用程序来查看日志记录数据库表。在 ViewModel 类中,我正在使用从 Linq 到 Sql DataContext
的前 100 个日志条目填充ObservableCollection
,并且我正在尝试使用 Rx 来保持 UI 响应。
以下代码片段有效,除非数据库不可用,此时应用会引发异常并崩溃。处理数据库连接异常的最佳位置在哪里,为什么不通过观察者的OnError
方法处理它们?
ObservableCollection<LogEntry> _logEntries = new ObservableCollection<LogEntry>();
DataContext dataContext = new DataContext( "connection string" );
(from e in dataContext.LogEntries
select e).Take( 100 ).ToObservable()
.SubscribeOn( Scheduler.ThreadPool )
.ObserveOnDispatcher()
.Subscribe( _logEntries.Add, ex => System.Diagnostics.Debug.WriteLine( ex.ToString() ) );
试试这个而不是 ToObservable:
public static IObservable<T> SafeToObservable(this IEnumerable<T> This)
{
return Observable.Create(subj => {
try {
foreach(var v in This) {
subj.OnNext(v);
}
subj.OnCompleted();
} catch (Exception ex) {
subj.OnError(ex);
}
return Disposable.Empty;
});
}
一般来说,这不是 Rx 的一个很好的用途,因为数据源不太容易 Rx'ify - 事实上,代码将在 UI 线程上执行大部分工作,将其发送到随机工作线程,然后将其发送回(即完全浪费的工作)。Task + Dispatcher.BeginInvoke 可能更适合您。