如果我在没有将IQueryable定义为任务的情况下使用await + ToListAsync(),这样做是否正确?
如果我在没有将IQueryable定义为任务的情况下使用await + ToListAsync(),这样做是否正确?
我正在使用asp.net MVC-5和EF-6,我不确定使用await + ToListAsync
是否有效。例如,我有以下的存储库方法,它返回一个IQueryable:-\n
public IQueryablegetAllScanEmailTo() { return t.TSets.Where(a=>a.Name.StartsWith("ScanEmail")); }
\n我这样调用它:-\n
var emailsTo = await repository.getAllScanEmailTo().ToListAsync();
\n起初,我以为会出错,因为我在使用\"await\"等待一个没有定义为任务的方法,但上述代码运行良好,所以有人可以给予建议吗?
在这个问题中,原因是使用了await + ToListAsync()来处理一个未定义为任务的IQueryable。解决方法是将IQueryable转换为Task后再进行await操作。
原因:
- await关键字不是用来等待方法的执行,而是用来等待可等待的Task对象的完成。
- 在调用getAllScanEmailTo方法时,返回的是一个IQueryable
- 然后调用ToListAsync方法将其转换为Task>类型的对象,并在此对象上执行await操作。
解决方法:
- 将IQueryable>后再进行await操作。
- 这样做可以确保在执行await操作时,会等待ToListAsync方法的完成。
代码示例:
IQueryablequeryable = getAllScanEmailTo(); Task > task = queryable.ToListAsync(); List
result = await task;
在这种情况下,可以将IQueryable视为被包装在一个Task中。因此,无论是否将IQueryable包装在Task中,对于这个场景来说并没有太大影响。
在使用await操作时,要确保等待的是一个可等待的Task对象,而不是一个普通的方法。可以通过将IQueryable转换为Task后再进行await操作来解决问题。这样做可以确保在await操作时,会等待相应的方法完成。使用await操作时,线程会被释放,不会一直占用IIS线程。无论是否将IQueryable包装在Task中,对于这个场景来说并没有太大影响。
这个问题的原因是询问在不定义为任务的IQueryable上使用await + ToListAsync()是否正确。解决方法是使用await + ToListAsync()来等待ToListAsync()方法的完成。
实际上没有问题,因为你等待的是ToListAsync()方法,而不是getAllScanEmailTo()方法。
编辑:要了解异步等待模式的工作原理,可以参考这个链接。下面是链接中的一个有用的图片:

所以我的做法是有效的吗?还是执行会被挂起直到IQueryable的ToListAsync()方法完成?
是的,我很了解这个执行路径,但我的原始问题是await + IQueryable如何一起工作。因为我不能将IQueryable包装在一个任务中,所以我使用await + ToListAsync(),但是在一个非任务方法上。这样会有任何副作用吗?还是我的代码会像将IQueryable包装在一个任务中一样工作?你明白我的意思吗?