Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重构多个自相关的等待调用_C#_Multithreading_Asynchronous_Async Await_Fluentvalidation - Fatal编程技术网

C# 重构多个自相关的等待调用

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方

我不得不在生产中调查一些异常,然后我发现了使用FluentValidation的代码:

(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);