与Rx进行DoAsync

时间:2014-08-29 14:22:45

标签: c# asynchronous .net-4.0 system.reactive async-await

首先,是否存在类似" DoAsync"的实现。与Rx一起使用?考虑到我使用相同的帖子,我有一个特定的SynchronizationContextIScheduler,有些像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?

1 个答案:

答案 0 :(得分:1)

对于.NET 4.0,最好的办法是在将异常传递给OnError之前将其包装起来。这将保留异常的堆栈跟踪。

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