将异步函数传递给具有操作类型的参数<X>?



应用程序有以下定义

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

传递了一个async函数:

async Task Process(X notification, CancellationToken ct) {...}
source.Subscribe(async x => await Process(x, CancellationToken.None)); // Warning

然而,ReSharper警告当委托类型返回'void'时避免使用'async' lambda,因为在Process中引发的异常不会被Catch捕获。

下面的代码没有任何警告。然而,我听说使用Wait()通常是一个糟糕的代码气味?

source.Subscribe(x => Process(x, CancellationToken.None).Wait());

当你在Subscribe Action中调用async函数时,你创建了一个async void方法。最好总是避免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();

相关内容

最新更新