如何在ASP.NET环境中异步枚举集合?

时间:2016-11-12 14:34:24

标签: c# asp.net entity-framework linq async-await

我的环境是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)吗?

1 个答案:

答案 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