应用程序有以下定义
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();