应用有如下定义
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());
当您在订阅操作中调用异步函数时,您将创建一个异步无效方法。正如 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();