Во-первых, существует ли такая реализация, как "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?
Для.NET 4.0 лучше всего обернуть исключение, прежде чем передавать его в OnError
. Это сохранит трассировку стека исключения.
obs.OnError(new ApplicationException("Error in DoAsync", ex));