C# 如果我使用wait+;未定义为任务的IQueryable上的ToListSync()
我将asp.net MVC-5与EF-6一起使用,我不确定使用WAIT+C# 如果我使用wait+;未定义为任务的IQueryable上的ToListSync(),c#,asynchronous,asp.net-mvc-5,async-await,entity-framework-6,C#,Asynchronous,Asp.net Mvc 5,Async Await,Entity Framework 6,我将asp.net MVC-5与EF-6一起使用,我不确定使用WAIT+ToListSync是否有效。例如,我有以下返回IQueryable的repository方法:- public IQueryable<TSet> getAllScanEmailTo() { return t.TSets.Where(a=>a.Name.StartsWith("ScanEmail")); } 一开始,我以为我会遇到一个错误,因为我使用的是“等待”方法,它没有被定义为任务,但
ToListSync
是否有效。例如,我有以下返回IQueryable的repository方法:-
public IQueryable<TSet> getAllScanEmailTo()
{
return t.TSets.Where(a=>a.Name.StartsWith("ScanEmail"));
}
一开始,我以为我会遇到一个错误,因为我使用的是“等待”方法,它没有被定义为任务,但上面的方法很好,所以有人能给我一些建议吗?实际上没有问题,因为你是在唤醒
tolistsync()
而不是getAllScanEmailTo()
编辑:要查看异步等待模式的工作方式,您可以查看以下内容。这里有一个有用的图像
你不是在“等待一种方法”。您正在等待一项可等待的任务
调用getAllScanEmailTo
返回一个IQueryable
,然后调用ToListSync
返回等待的任务
一开始我以为我会出错,因为我正在使用
“等待”是一种未定义为任务的方法,但上述方法有效
嗯
实际上,您正在等待一个返回任务的方法,其中T
是一个列表
。如果查看扩展方法,您将看到它返回一个任务
。您正在异步等待此方法查询数据库、创建列表并将其返回给调用方。当您对此类方法等待时,该方法将在操作完成之前不会返回。async await使您的代码感觉是同步的,而执行实际上是异步的。那么像我这样使用IQuerable with await是有效的吗?或者这样做将暂停执行,直到IQueryable的toListSync()方法完成为止。@johnG yes。您正在等待的是任务
,而不是IQueryable
。是的,您将等待ToListAsync
完成。但这样做将暂停执行,直到IQueryable的ToListAsync()方法完成???@johnG yes。wait将异步等待操作完成。@johnG否。当您等待异步操作时,线程被释放。那么我的方法有效吗?或者这样做将暂停执行,直到IQueryable的toListSync()方法完成。是的,我非常了解此执行路径,但我最初的问题是will wait+IQueryable如何协同工作。因为我不能将IQueryable包装到任务中。。因此,我使用wait+ToListAsync()但使用的是非任务方法,这会有任何副作用吗?,或者我的代码会像将IQueryable包装在任务中一样工作??你明白我的意思了吗?很好且完整的解释。@Yuval of i已经意识到了这一点,但通常我在任务上使用wait,代码中的所有方法链都是Task+wait。。但是,由于我不能用任务包装IQueryable,所以我是这样做的,我使用IQueryable-->wait.toListSync()。。。那么,这段代码是否会像IQueryable被包装在任务中一样工作?。所以在我的例子中,iis线程将被释放,直到ToListSync()完成执行,就像正常等待一样?@johnG Yes。当查询执行时,线程将被释放,并在查询完成后返回。@johnG如果您的方法同步执行,并返回一个雇员,那么您就不能异步运行它,因为API本身是同步的。@YuvalItzchakov但是如果我使用SingleOrDefualtAsync,那么我可以获得single Employee async?这是正确的吗?
var emailsTo = await repository.getAllScanEmailTo().ToListAsync();