C# 重构多个自相关的等待调用
我不得不在生产中调查一些异常,然后我发现了使用FluentValidation的代码:C# 重构多个自相关的等待调用,c#,multithreading,asynchronous,async-await,fluentvalidation,C#,Multithreading,Asynchronous,Async Await,Fluentvalidation,我不得不在生产中调查一些异常,然后我发现了使用FluentValidation的代码: (inside async method) var validator = new SomeCustomValidator(); var validationResult = validator.ValidateAsync(request).Result.ValidateRepositoryAsync(request, someRepository); PS:ValidateRepositoryAsync方
(inside async method)
var validator = new SomeCustomValidator();
var validationResult = validator.ValidateAsync(request).Result.ValidateRepositoryAsync(request, someRepository);
PS:ValidateRepositoryAsync方法是我们项目的自定义扩展
为了对其进行一点重构,我刚改为:
(inside async method)
ValidationResult validationResult;
var validator = new SomeCustomValidator();
validationResult = await validator.ValidateAsync(request);
validationResult = await validationResult.ValidateRepositoryAsync(request, someRepository);
因此,这些代码需要首先执行ValidateAsync
,等待它,然后根据结果执行ValidateRepositoryAsync
现在的问题是,我想知道是否有其他方法可以做到这一点,可能是在一行代码中,使用ContinueWith,或者这是解决这个问题的更干净的方法
我离这越近了,但这看起来并不清楚:
var validator = new SomeCustomValidator();
var validationResult = await (await validator.ValidateAsync(request)).ValidateRepositoryAsync(request, someRepository);
有什么想法吗
谢谢 因为
ValidateRepositoryAsync
是您自己的扩展方法,所以您可以创建它的另一个原型,这个原型接受未等待的任务
static async Task<ValidationResult> ValidateRepositoryAsync(this Task<ValidationResult> source, request, someRepository)
{
var result = await source;
return await result.ValidateRepositoryAsync(request, someRepository);
}
没问题,链接等待这样的呼叫是推荐的方式。请注意,
Result
肯定不是问题的根源。要了解根本原因,您需要检查AggregateException的InnerException
属性。作为一个好的实践,您应该记录exception.ToString()
,您将从中获得清洁度的中间变量中的所有信息,但这两个变量是correct@KevinGosse非常感谢。我对内部异常本身做了更多的研究,问题似乎是db连接中的随机拒绝。因此,我将删除我所说的异常部分。但事实上,我认为我的问题对某些人还是有用的,因为我在这里看到了其他帖子,询问如何在“一行代码”中进行多次等待。不知道为什么我的问题被否决了。@AluanHaddad谢谢你的建议。
validationResult = await validator.ValidateAsync(request).ValidateRepositoryAsync(request, someRepository);