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

问题描述 投票:8回答:3

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

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

我称之为: -

var emailsTo = await repository.getAllScanEmailTo().ToListAsync();

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

c# asynchronous asp.net-mvc-5 async-await entity-framework-6
3个回答
19
投票

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

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


11
投票

实际上没有问题,因为你正在等待qazxsw poi而不是qazxsw poi。

编辑:要查看async-await模式是如何工作的,你可以看到这个ToListAsync()。这是一张有用的图片

getAllScanEmailTo()


2
投票

你不是在“等待一种方法”。你正在等待link,这是一个等待的。

你打电话给enter image description here,它返回一个Task,你可以在其上调用getAllScanEmailTo,它返回你正在等待的IQueryable<TSet>

© www.soinside.com 2019 - 2024. All rights reserved.