我的环境是ASP.NET Core和EF Core。我需要异步" page"请求期间的实体集合。
所以我创建了这个集合类:
public class PagedList<T> : IEnumerable<T> { /* ... */ }
这种异步枚举的扩展方法:
public static async Task<PagedList<T>> ToPagedListAsync<T>(this IQueryable<T> items, int pageSize, int pageNumber) {
return await Task.Run(() => new PagedList<T>(items, pageSize, pageNumber));
}
现在我可以这样做:
var stuff = await repository.CreateQueryableForLoadingStuff().ToPagedListAsync(10, 1);
我查看了source for EF's ToListAsync()
作为指导 - 它并不像我已经完成的那样包装同步操作,而是异步地直接枚举到新的集合中。 I also saw this这解释了FooAsync()
方法不是真的&#34; async,如果它使用Task.Run()
启动一个新线程,并且由于我在ASP.NET请求中运行,这可能是错误的方法。
我的方式是否适合我的环境(ASP.NET Core和EF Core),还是应该使用该链接中的方法?另外,我应该使用.ConfigureAwait(false)
吗?
答案 0 :(得分:0)
我认为你错放了你的异步组件。您希望I / O部分(EF / Repository)上的异步,而不是内存中的部分(PagedList
),所以请改为:
public static PagedList<T> ToPagedList<T>(this IQueryable<T> items, int pageSize, int pageNumber) {
return new PagedList<T>(items, pageSize, pageNumber);
}
然后你可以这样做......
var stuff = (await repository.CreateQueryableForLoadingStuffAsync()).ToPagedList(10, 1);
......这只是你想要的几个方面。
编辑:在注释中,这不会让您有效地使用可查询来约束SQL查询,并且您将在内存中进行分页。作为有效查询工作的替代方法,请查看PagedList and Async