C# - IQIeryable to ToList Async - EF6

时间:2016-04-09 13:21:53

标签: c# entity-framework asynchronous repository

我有一个带有存储库模式方法的EF 6项目。

private readonly DbContext _ctx = new SomeDbContext();

public IQueryable<TEntity> GetAll(bool noTracking = false)
{
    return !noTracking ? _ctx.Set<TEntity>() : _ctx.Set<TEntity>().AsNoTracking();
}

在我的其他项目中,这是与业务相关的,并且没有任何对EntityFramework.dll的引用,它只是访问存储库项目,我已经创建了自己的ToListAsync扩展方法。

它从存储库返回T对象的IQueryable并将其异步转换为T的列表。

public static async Task<IList<T>> ToListAsync<T>(this IQueryable<T> query)
{
    return await new Task<IList<T>>(query.ToList);
}

用法:

await GetAll(true).Where(<some predicate>).ToListAsync();
事情是,它只是不起作用。当debbuger点击扩展方法并尝试传递它时,它只是停止调试,没有错误,没有异常,它只是完全停止了应用程序。

我试图改变创建任务的方式,但没有进展。

为什么会这样?

感谢。

更新

Altough我已经改变了扩展方法,它显然有效,但仍有一种奇怪的行为。

扩展方法仅在我断点时执行或者不将其称为异步,如果让它自由运行,调试器/应用程序退出,它不会执行更多代码。

使用:

var x = repo.GetAll(true).ToListAsync().Result;

不起作用(应用程序刚退出)

var x = await repo.GetAll(true).ToListAsync();

更新2

所有这些测试都在控制台应用程序中进行,因此需要wait异步方法,否则它将退出。

MethodX().Wait();

2 个答案:

答案 0 :(得分:1)

您创建的任务未启动。您需要先调用Start()。

答案 1 :(得分:0)

好吧,我稍微改变了扩展方法。

return await Task.Run(() => query.ToList());

显然它现在正在运作,但我几乎可以肯定我已经尝试过了......

非常感谢。