何时应将 AllowSynchronousContinuations 选项与 Channels 一起使用?

时间:2021-08-01 16:55:11

标签: c# asp.net-core asp.net-core-hosted-services

我正在 Asp Net Core 应用程序中实现简单的后台作业队列。我已经创建了 BackgroundJobQueue,它在底层使用 BoundedChannel<T> 来排队将通过 HostedService 处理的项目。阅读文档时我偶然发现了 ChannelOptions.AllowSynchronousContinuations 频道设置。

根据msdn的描述说:

<块引用>

将此选项设置为 true 可以通过避免安排额外的工作项目来提供可衡量的吞吐量改进。然而,它可能以减少并行性为代价,例如,生产者可能是执行与消费者相关的工作的人,如果不考虑周到,这可能会导致意外的交互。默认为 false。

我不太明白在我的情况下将此选项设置为 true 是否是一个不错的选择。当此选项有用/无用/有害时,有人可以解释并提供示例吗?

编辑

我得到的解释:

<块引用>

根据官方声明,当生产者依赖消费者时,它会等待消费者的工作完成然后开始工作,如果您启用该选项,生产者会遇到更多空闲时间。但是,如果您禁用该选项,由于并行性,生产者的空闲时间会减少。

启用选项是不是很糟糕?由于 api 请求将需要更长的时间来处理,因为生产者将保持空闲更长的时间。澄清我的意思。假设我想在我的控制器中加入后台作业

public async Task<IActionResult> Action()
{
    // some code
   await _backgroundJobQueue(() => ....);
   return Ok();
}

如果启用该选项,那么生产者会遇到更多空闲时间,因此执行操作需要更长的时间?

1 个答案:

答案 0 :(得分:1)

您有一个后台队列。因此,您是通过使用排队作业来同步操作。最好Enable,因为您不想要并行性,并且文档声称“它提供了可衡量的吞吐量改进

<块引用>

例如,生产者可能是执行工作的人 与消费者相关联

根据官方的说法,当生产者依赖消费者时,它会等待消费者的工作完成然后开始工作,如果您Enable选项,生产者会遇到更多空闲时间。但是,如果您Disabled 选择该选项,由于并行性,生产者的空闲时间会减少。

这是我的理解和例证