如果我在没有将IQueryable定义为任务的情况下使用await + ToListAsync(),这样做是否正确?

23 浏览
0 Comments

如果我在没有将IQueryable定义为任务的情况下使用await + ToListAsync(),这样做是否正确?

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

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

\n我这样调用它:-\n

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

\n起初,我以为会出错,因为我在使用\"await\"等待一个没有定义为任务的方法,但上述代码运行良好,所以有人可以给予建议吗?

0
0 Comments

在这个问题中,原因是使用了await + ToListAsync()来处理一个未定义为任务的IQueryable。解决方法是将IQueryable转换为Task后再进行await操作。

原因:

- await关键字不是用来等待方法的执行,而是用来等待可等待的Task对象的完成。

- 在调用getAllScanEmailTo方法时,返回的是一个IQueryable类型的对象。

- 然后调用ToListAsync方法将其转换为Task>类型的对象,并在此对象上执行await操作。

解决方法:

- 将IQueryable转换为Task>后再进行await操作。

- 这样做可以确保在执行await操作时,会等待ToListAsync方法的完成。

代码示例:

IQueryable queryable = getAllScanEmailTo();
Task> task = queryable.ToListAsync();
List result = await task;

在这种情况下,可以将IQueryable视为被包装在一个Task中。因此,无论是否将IQueryable包装在Task中,对于这个场景来说并没有太大影响。

在使用await操作时,要确保等待的是一个可等待的Task对象,而不是一个普通的方法。可以通过将IQueryable转换为Task后再进行await操作来解决问题。这样做可以确保在await操作时,会等待相应的方法完成。使用await操作时,线程会被释放,不会一直占用IIS线程。无论是否将IQueryable包装在Task中,对于这个场景来说并没有太大影响。

0
0 Comments

这个问题的原因是询问在不定义为任务的IQueryable上使用await + ToListAsync()是否正确。解决方法是使用await + ToListAsync()来等待ToListAsync()方法的完成。

实际上没有问题,因为你等待的是ToListAsync()方法,而不是getAllScanEmailTo()方法。

编辑:要了解异步等待模式的工作原理,可以参考这个链接。下面是链接中的一个有用的图片:

![enter image description here](https://i.stack.imgur.com/jTzhU.png)

所以我的做法是有效的吗?还是执行会被挂起直到IQueryable的ToListAsync()方法完成?

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

0
0 Comments

是的,如果您使用SingleOrDefaultAsync方法,您可以异步地获取一个单独的员工。

0