使用 Linq to SQL 和 Rx 处理数据库连接异常



我正在尝试学习如何最好地使用反应式扩展库,并设置了简单的测试 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 可能更适合您。

相关内容

  • 没有找到相关文章

最新更新