我有一个带有存储库模式方法的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();
答案 0 :(得分:1)
您创建的任务未启动。您需要先调用Start()。
答案 1 :(得分:0)
好吧,我稍微改变了扩展方法。
return await Task.Run(() => query.ToList());
显然它现在正在运作,但我几乎可以肯定我已经尝试过了......
非常感谢。