首先,是否存在类似" 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找到有关异常的一些问题: Is it possible to get a good stack trace with .NET async methods?
答案 0 :(得分:1)
对于.NET 4.0,最好的办法是在将异常传递给OnError
之前将其包装起来。这将保留异常的堆栈跟踪。
obs.OnError(new ApplicationException("Error in DoAsync", ex));