【发布时间】:2014-10-23 14:02:03
【问题描述】:
首先,是否有像“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?
【问题讨论】:
-
查看 ExceptionDispatchInfo 类
-
您使用的是什么版本的 Visual Studio?
-
VS2013 应该有improved that.
-
@NedStoyanoy VS 2012 和 .NET 4.0
-
@HamletHakobyan 此类仅在 .NET 4.5 + 中可用
标签: c# asynchronous .net-4.0 system.reactive async-await