我正在实现Asp.Net Core应用程序中的简单后台作业队列。我创建了
根据msdn上面的说明:
将此选项设置为true可以通过避免调度其他工作项来提供可衡量的吞吐量改进。但是,这可能会以减少并行性的代价为代价,例如生产者可能是执行与消费者关联的工作的那个人,并且如果没有经过深思熟虑地完成,则可能导致意外的相互作用。默认值为false。
我不太明白在我的情况下将此选项设置为true是否是一个好选择。有人能解释一下,并提供此选项何时有用/无用/有害的示例吗?
编辑:
我得到的解释是:
根据官方声明,当生产者依赖于消费者时,它等待消费者的工作完成,然后开始自己的工作,如果启用该选项,则生产者经历更多的空闲时间。但是,如果禁用了该选项,由于并行性,生产者经历较低的空闲时间。
启用选项不好吗?因为API请求将需要更长时间来处理,因为生产者将保持空闲更长时间。让我解释一下我的意思。假设我想在控制器中排队后台作业。
如果启用了该选项,那么生产者将会有更多的空闲时间,因此它执行操作所需的时间会更长。
BackgroundJobQueue
,它在底层使用BoundedChannel<T>
来排队项,这些项将通过HostedService
进行处理。阅读文档时,我遇到了有关通道的ChannelOptions.AllowSynchronousContinuations设置。根据msdn上面的说明:
将此选项设置为true可以通过避免调度其他工作项来提供可衡量的吞吐量改进。但是,这可能会以减少并行性的代价为代价,例如生产者可能是执行与消费者关联的工作的那个人,并且如果没有经过深思熟虑地完成,则可能导致意外的相互作用。默认值为false。
我不太明白在我的情况下将此选项设置为true是否是一个好选择。有人能解释一下,并提供此选项何时有用/无用/有害的示例吗?
编辑:
我得到的解释是:
根据官方声明,当生产者依赖于消费者时,它等待消费者的工作完成,然后开始自己的工作,如果启用该选项,则生产者经历更多的空闲时间。但是,如果禁用了该选项,由于并行性,生产者经历较低的空闲时间。
启用选项不好吗?因为API请求将需要更长时间来处理,因为生产者将保持空闲更长时间。让我解释一下我的意思。假设我想在控制器中排队后台作业。
public async Task<IActionResult> Action()
{
// some code
await _backgroundJobQueue(() => ....);
return Ok();
}
如果启用了该选项,那么生产者将会有更多的空闲时间,因此它执行操作所需的时间会更长。