DoAsync с Rx

1

Во-первых, существует ли такая реализация, как "DoAsync" для использования с Rx? Учитывая, что у меня есть определенный SynchronizationContext и IScheduler используя тот же поток, некоторые вроде https://gist.github.com/OmerMor/1554548

Теперь см. Следующий код:

  public static IObservable<T> DoAsyncWithFallBack<T>(this IObservable<T> source, Func<T, Task> accessor, Action<T, Exception> localizedFallback)
    {
        return new AnonymousObservable<T>(obs =>
        {
            return source.Subscribe(async x =>
            {
                try
                {
                    await accessor(x);
                    obs.OnNext(x);
                }
                catch (Exception ex)
                {
                    localizedFallback(x, ex);
                    obs.OnError(ex);
                }
            }, obs.OnError, obs.OnCompleted);
        });
    } 

и использование (например,):

   Observable.Return(1)
             .ObserveOn(scheduler)
             .Select(a => new
                             {
                                 EventData = a,
                                 Task = TaskEx.Run(() => DoSomething(a))
                             })
             .DoAsyncWithFallBack(async a => await a.Task, (a, ex) => FallBackPlan(a.EventData, ex))
             .Subscribe(next => {}, ex => {});

Используя этот код выше, если я получаю исключение, трассировка стека не помогает мне вообще, я теряю информацию о методе DoSomething, каков был бы правильный способ ее получить?

Если вы немного ищете, вы можете найти некоторые проблемы с исключениями с помощью async/await: возможно ли получить хорошую трассировку стека с методами.NET async?

  • 0
    Посмотрите на класс ExceptionDispatchInfo
  • 0
    какую версию Visual Studio вы используете?
Показать ещё 3 комментария
Теги:
async-await
asynchronous
.net-4.0
system.reactive

1 ответ

1

Для.NET 4.0 лучше всего обернуть исключение, прежде чем передавать его в OnError. Это сохранит трассировку стека исключения.

obs.OnError(new ApplicationException("Error in DoAsync", ex));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню