开发者

Handling database connection exceptions with Linq to SQL and Rx

开发者 https://www.devze.com 2023-03-05 23:00 出处:网络
I am trying learn how to best use the Reactive Extensions library and have set up simple test WPF application to view a logging database table. In a ViewModel class I am 开发者_如何转开发populating an

I am trying learn how to best use the Reactive Extensions library and have set up simple test WPF application to view a logging database table. In a ViewModel class I am 开发者_如何转开发populating an ObservableCollection with the first 100 log entries from a Linq to Sql DataContext and I'm trying to use Rx to keep the UI responsive.

The following snippet works unless the database is unavailable at which point the app throws an exception and crashes. Where would be the best place to handle database connection exceptions and why are they not handled by the OnError method of the Observer?

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() ) );


Try this instead of 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;
    });
}

In general though, this isn't a great use of Rx since the data source isn't very easy to Rx'ify - in fact, the code will execute most of the work on the UI thread, send it out to random worker threads, then send it back (i.e. completely wasted work). Task + Dispatcher.BeginInvoke might suit you better here.

0

精彩评论

暂无评论...
验证码 换一张
取 消