将异步函数传递给类型为 Action<X> 的参数? [重复]

问题描述 投票:0回答:1

应用有如下定义

IDisposable IObservable<X>.Subscribe<X>(Action<X> onNext)

它被传递了一个异步函数:

async Task Process(X notification, CancellationToken ct) {...}

source.Subscribe(async x => await Process(x, CancellationToken.None)); // Warning

但是,ReSharper 警告“当委托类型返回‘void’时避免使用‘async’lambda”,因为在 MyFuncAsync 中引发的异常不会被 Catch 捕获。

以下代码没有任何警告。但是,我听说使用

Wait()
通常是一种糟糕的代码味道?

source.Subscribe(x => Process(x, CancellationToken.None).Wait());
c# asynchronous async-await system.reactive rx.net
1个回答
0
投票

当您在订阅操作中调用异步函数时,您将创建一个异步无效方法。正如 Resharper 正确指出的那样,始终避免 async void 是很好的,因为潜在的异常正在 void 中消失。

调用异步函数的更好方法是这样的: 还要注意异常的捕获。

source
   .Select(result =>
       Observable.FromAsync(() => observer.OnCalculationFinished(result))
          .Catch((Exception ex) =>
          {
             Log.Error(ex, "Error on VEV calculation subscription for client {Client} {Quarter}.", result.VevQuarterCalculation.ClientId, result.VevQuarterCalculation.Quarter);
             return Observable.Empty<System.Reactive.Unit>();
           }))
   .Concat()
   .Subscribe();
© www.soinside.com 2019 - 2024. All rights reserved.