C# 异步分页<;T>;异步获取第一个结果
我有C# 异步分页<;T>;异步获取第一个结果,c#,async-await,C#,Async Await,我有AsyncPageable,只想从列表中获取第一个结果 MS docs建议使用wait foreach // call a service method, which returns AsyncPageable<T> AsyncPageable<SecretProperties> allSecretProperties = client.GetPropertiesOfSecretsAsync(); await foreach (SecretProperties se
AsyncPageable
,只想从列表中获取第一个结果
MS docs建议使用wait foreach
// call a service method, which returns AsyncPageable<T>
AsyncPageable<SecretProperties> allSecretProperties = client.GetPropertiesOfSecretsAsync();
await foreach (SecretProperties secretProperties in allSecretProperties)
{
Console.WriteLine(secretProperties.Name);
}
由于AsyncPageable
实现了IAsyncEnumerable
,因此您可以安装nuget并使用它提供的方法:
var result = await allSecretProperties.FirstOrDefaultAsync();
只需将您拥有的内容包装到扩展方法中
// hrmmm, im not sure
public static async Task<T> FirstOrDefaultAsync<T>(this IAsyncEnumerable<T> enumerable)
{
await foreach (var item in enumerable)
return item;
return default;
}
// This is more efficient
public static async Task<T> FirstOrDefaultAsync2<T>(this IAsyncEnumerable<T> enumerable)
{
var enumerator = enumerable.GetAsyncEnumerator();
await enumerator.MoveNextAsync();
return enumerator.Current;
}
//嗯,我不确定
公共静态异步任务FirstOrDefaultAsync(此IAsyncEnumerable可枚举)
{
等待foreach(可枚举中的变量项)
退货项目;
返回默认值;
}
//这样效率更高
公共静态异步任务FirstOrDefaultAsync2(此IAsyncEnumerable可枚举)
{
var enumerator=enumerable.GetAsyncEnumerator();
等待枚举数。MoveNextAsync();
返回枚举数.Current;
}
它不是专门为适应此用例而构建的。我可能只是在
等待foreach
中使用一个无条件的中断
,而不是挖掘枚举器机制。当然,你仍然需要处理0个结果。你正在尽可能地提高效率。只需将其包装在扩展方法中。为此方法拉入库是一种浪费IAsyncEnumerable
不包含FirstOrDefaultAsync
,因此这不起作用。@DeivydasVoroneckis是否安装了NuGet?注意:将System.Linq.Async
与EFCore一起使用会导致我的整个解决方案因对所有Linq的模糊引用而中断。其中导入System.Linq
和Microsoft.EntityFrameworkCore
的文件中的子句。已知问题请参见:和@ttugatesMicrosoft.EntityFrameworkCore
与此相关吗?你读过OP的问题了吗?@rytisk-这是一个合理的评论,可以预期与半年内发布的>500个用户中的一个重要子集相关。使用AsyncPageable
(一个MS Azure库,碰巧也使用MS EFCore)的用户可以受益于我评论中的免费信息。这是我希望在遵循您发布的这个完全有效的答案之前知道的信息。Re:“你读过OP的问题了吗?”-如果你想深入讨论对话,我很乐意与你聊天。效率更高,部分原因是它不尊重异步处理。@Damien_不信者是的,我一直在试图弄清楚这是否会引起问题。另外,在看了这两个代码块一段时间后,我认为从美学角度来说,我会选择foreach
// hrmmm, im not sure
public static async Task<T> FirstOrDefaultAsync<T>(this IAsyncEnumerable<T> enumerable)
{
await foreach (var item in enumerable)
return item;
return default;
}
// This is more efficient
public static async Task<T> FirstOrDefaultAsync2<T>(this IAsyncEnumerable<T> enumerable)
{
var enumerator = enumerable.GetAsyncEnumerator();
await enumerator.MoveNextAsync();
return enumerator.Current;
}