【问题标题】:DoAsync with RxDoAsync 与 Rx
【发布时间】:2014-10-23 14:02:03
【问题描述】:

首先,是否有像“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?

【问题讨论】:

  • 查看 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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多