【发布时间】:2020-03-04 13:43:27
【问题描述】:
正如标题所说,我必须遵循以下功能:
public async IAsyncEnumerable<Job> GetByPipeline(int pipelineId,
[EnumeratorCancellation] CancellationToken cancellationToken = default)
{
await foreach (var job in context.Jobs.Where(job => job.Pipeline.Id == pipelineId)
.AsAsyncEnumerable()
.WithCancellation(cancellationToken)
.ConfigureAwait(false))
{
yield return job;
}
}
我很难理解取消令牌的去向,并且感觉我在太多地方使用它。
当您解构所有花哨的异步内容时,这里实际发生了什么?有没有更好的方法来编写这个函数?
【问题讨论】:
-
AsAsyncEnumerable()已经返回IAsyncEnumerable<Job>。您不需要其余代码,只需返回即可,即return context.Jobs.Where(job => job.Pipeline.Id == pipelineId) .AsAsyncEnumerable() -
@PanagiotisKanavos 不过它不支持
CancellationToken,WithCancellation的结果不能转换为IAsyncEnumerable -
这些调用只在调用者的站点上有意义。当您尝试迭代 IAsyncEnumerable 时,您必须再次添加它们
-
此外,在这种情况下,两者都没有太大影响。即使取消迭代也无法取消查询,而
ConfigureAwait(false)将在何处恢复执行的决定传递给调用者。
标签: c# async-await c#-8.0 ef-core-3.0 iasyncenumerable