我有以下工作代码:
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
属性来访问ValidationResult
对象。
我记得很久以前就读过一些有关使用Task.Result
的内容,这可能会导致死锁。这个解决方案好还是有更好的解决方案?
答案 0 :(得分:3)
我使用此扩展名:
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();