Rem*_*us 5 .net c# linq entity-framework async-await
您好我正在寻找一种让All方法在异步模式下运行的方法.事实上,我正试图想办法在LINQ中何时需要它来使用异步.一些linq方法也有异步定义,我不太明白为什么不是所有方法都有异步定义,所以也许有人可以为我清理.
与我有关,试图让所有运行异步
版本1
async Task<bool> IHrtbProfileValidator.ValidateHrtb(UserHrtbProfileDTO dto_Hrtb)
{
var x = _validator.All(async (ck) => await ck.ValidateHrtb(dto_Hrtb));
return x;
}
Run Code Online (Sandbox Code Playgroud)
版本2
var x = _validator.All((ck) => await ck.ValidateHrtb(dto_Hrtb));
Run Code Online (Sandbox Code Playgroud)
版本3
var x = _validator.All(async (ck) => await ck.ValidateHrtb(dto_Hrtb).Result);
Run Code Online (Sandbox Code Playgroud)
这就是我尝试过的
我的想法是,我有一个IValidator接口,多个验证器类通过该接口实现每个负责的自己的验证相关逻辑.在MainValidator类中,我只是想调用All方法来验证IValidator列表.
谢谢你们
你不能让All方法本身是异步的,但你可以做的是做a Select,等待结果,然后将结果传递给All
async Task<bool> IHrtbProfileValidator.ValidateHrtb(UserHrtbProfileDTO dto_Hrtb)
{
IEnumerable<Task<bool>> items = _validator.Select(ck => ck.ValidateHrtb(dto_Hrtb));
bool[] results = await Task.WhenAll(items);
var x = results.All(item => item);
return x;
}
Run Code Online (Sandbox Code Playgroud)
另一个选择是您可以创建自己的AllAsync扩展方法,该方法可以将任务用作源或谓词.
public static class ExtensionMethods
{
// This is for async predicates with either a sync or async source.
// This is the only one you need for your example
public static async Task<bool> AllAsync<TSource>(this IEnumerable<TSource> source, Func<TSource, Task<bool>> predicate)
{
if (source == null)
throw new ArgumentNullException(nameof(source));
if (predicate == null)
throw new ArgumentNullException(nameof(predicate));
foreach (var item in source)
{
var result = await predicate(item);
if (!result)
return false;
}
return true;
}
// This is for synchronous predicates with an async source.
public static async Task<bool> AllAsync<TSource>(this IEnumerable<Task<TSource>> source, Func<TSource, bool> predicate)
{
if (source == null)
throw new ArgumentNullException(nameof(source));
if (predicate == null)
throw new ArgumentNullException(nameof(predicate));
foreach (var item in source)
{
var awaitedItem = await item;
if (!predicate(awaitedItem))
return false;
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
那你可以做
async Task<bool> IHrtbProfileValidator.ValidateHrtb(UserHrtbProfileDTO dto_Hrtb)
{
var x = await _validator.AllAsync((ck) => ck.ValidateHrtb(dto_Hrtb));
return x;
}
Run Code Online (Sandbox Code Playgroud)