gpt4 book ai didi

.net - 如何将 "Where"与异步谓词一起使用?

转载 作者:行者123 更新时间:2023-12-02 15:01:50 25 4
gpt4 key购买 nike

我有一个像这样的异步谓词方法:

private async Task<bool> MeetsCriteria(Uri address)
{
//Do something involving awaiting an HTTP request.
}

假设我有一个 Uri 集合:

var addresses = new[]
{
new Uri("http://www.google.com/"),
new Uri("http://www.stackoverflow.com/") //etc.
};

我想使用 MeetsCriteria 过滤地址。我想异步执行此操作;我希望对谓词的多个调用异步运行,然后我想等待所有调用完成并生成筛选的结果集。不幸的是,LINQ 似乎不支持异步谓词,因此像这样的东西不起作用:

var filteredAddresses = addresses.Where(MeetsCriteria);

有没有类似方便的方法来做到这一点?

最佳答案

我认为框架中没有这样的内容的原因之一是存在很多可能的变化,并且在某些情况下每种选择都是正确的:

  • 谓词应该并行执行还是串行执行?
    • 如果并行执行,是否应该全部同时执行,还是应该限制并行度?
    • 如果它们并行执行,结果应该与原始集合的顺序相同、完成的顺序还是未定义的顺序?
      • 如果应按完成顺序返回它们,是否应该有某种方法(异步)在完成时获取结果? (这需要将返回类型从 Task<IEnumerable<T>> 更改为其他类型。)

您说过您希望谓词并行执行。在这种情况下,最简单的选择是一次性执行它们并按完成顺序返回它们:

static async Task<IEnumerable<T>> Where<T>(
this IEnumerable<T> source, Func<T, Task<bool>> predicate)
{
var results = new ConcurrentQueue<T>();
var tasks = source.Select(
async x =>
{
if (await predicate(x))
results.Enqueue(x);
});
await Task.WhenAll(tasks);
return results;
}

然后你可以像这样使用它:

var filteredAddresses = await addresses.Where(MeetsCriteria);

关于.net - 如何将 "Where"与异步谓词一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14889988/

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