我有以下工作代码:
var failures = _validators
.Select(v => v.Validate(request))
.SelectMany(result => result.Errors)
.Where(f => f != null)
.ToList();
Validate
方法返回 ValidationResult
对象。
我想更改 Validate
ValidateAsync
的方法,然后我使用 async/await
在Select
里面.现在它不返回 IEnumerable<ValidationResult>
, 而不是 IEnumerable<Task<ValidationResult>>
和 SelectMany
通话不再有效。
所以我把代码改成这样:
var failures = _validators
.Select(async v => await v.ValidateAsync(request))
.SelectMany(result => result.Result.Errors)
.Where(f => f != null)
.ToList();
我正在使用 Result
Task
的属性(property)对象访问 ValidationResult
目的。
我记得很久以前读过一些关于使用它的文章 Task.Result
可能导致僵局。这个解决方案好还是有更好的?
最佳答案
我使用这个扩展:
public static async Task<TResult[]> SelectAsync<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, Task<TResult>> selector)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
if (selector == null)
{
throw new ArgumentNullException(nameof(selector));
}
return await Task.WhenAll(source.Select(selector));
}
var temp = await _validators
.SelectAsync(v => v.ValidateAsync(request));
var result = temp.SelectMany(result => result.Errors)
.Where(f => f != null)
.ToList();
关于C# 异步选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56159976/