如果我在IQueryable上使用await + ToListAsync()并且未定义为任务,那么它是否正确?

joh*_* Gu 11 c# asynchronous async-await entity-framework-6 asp.net-mvc-5

我正在使用带有EF-6的asp.net MVC-5,我不确定使用await + ToListAsync是否有效.例如,我有以下存储库方法,它返回IQueryable: -

public IQueryable<TSet> getAllScanEmailTo()
{
    return t.TSets.Where(a=>a.Name.StartsWith("ScanEmail"));    
}
Run Code Online (Sandbox Code Playgroud)

我称之为: -

var emailsTo = await repository.getAllScanEmailTo().ToListAsync();
Run Code Online (Sandbox Code Playgroud)

一开始,我以为我会得到一个错误,因为我正在使用"等待"一个未被定义为任务的方法,但上面工作得很好,所以有人可以就此提出建议吗?

Yuv*_*kov 20

在开始我虽然我会得到一个错误,因为我正在使用"等待"一个没有被定义为任务的方法,但上面工作得很好

实际上,你正在等待一个返回a的方法Task<T>,其中T是a List<TSet>.如果你看一下扩展方法QueryableExtensions.ToListAsync,你会看到它返回一个Task<List<TSource>>.您异步等待此方法查询数据库,创建列表并将其返回给调用者.当你await使用这种方法时,该方法将不会返回,直到操作完成.async-await使您的代码感觉同步,而执行实际上是异步的.


Hos*_*Rad 12

实际上没有问题,因为你是在争吵而ToListAsync()不是getAllScanEmailTo().

编辑:要查看async-await模式是如何工作的,您可以看到此链接.这是一张有用的图片

在此输入图像描述