Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果我使用wait+;未定义为任务的IQueryable上的ToListSync()_C#_Asynchronous_Asp.net Mvc 5_Async Await_Entity Framework 6 - Fatal编程技术网

C# 如果我使用wait+;未定义为任务的IQueryable上的ToListSync()

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")); } 一开始,我以为我会遇到一个错误,因为我使用的是“等待”方法,它没有被定义为任务,但

我将asp.net MVC-5与EF-6一起使用,我不确定使用WAIT+
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();