gpt4 book ai didi

c# - LINQ 使所有方法异步

转载 作者:太空狗 更新时间:2023-10-29 23:13:00 29 4
gpt4 key购买 nike

您好,我正在寻找一种使 All 方法在异步模式下运行的方法。事实上,我正在尝试想出一种方法,在 LINQ 中需要时如何使用异步。一些 linq 方法也有异步定义,我不太明白为什么不是所有方法都有异步定义,所以也许有人可以为我解决问题。

与我试图让 All 异步运行有关

Version 1

 async Task<bool> IHrtbProfileValidator.ValidateHrtb(UserHrtbProfileDTO dto_Hrtb)
{
var x = _validator.All(async (ck) => await ck.ValidateHrtb(dto_Hrtb));
return x;
}

Version 2

var x = _validator.All((ck) => await ck.ValidateHrtb(dto_Hrtb));

Version 3

  var x = _validator.All(async (ck) => await ck.ValidateHrtb(dto_Hrtb).Result);

这是我试过的

我的想法是我有一个 IValidator 接口(interface),多个验证器类从该接口(interface)实现每个负责自己的验证相关逻辑。在 MainValidator 类中,我只是想调用 All 方法来验证 IValidator 列表。

谢谢大家

最佳答案

您不能使 All 方法本身异步,但您可以做的是执行 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;
}

另一种选择是您可以创建自己的 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;
}
}

然后你可以做

async Task<bool> IHrtbProfileValidator.ValidateHrtb(UserHrtbProfileDTO dto_Hrtb)
{
var x = await _validator.AllAsync((ck) => ck.ValidateHrtb(dto_Hrtb));
return x;
}

关于c# - LINQ 使所有方法异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39596919/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com