通过参数控制Hangfire并发

时间:2019-01-28 13:06:15

标签: c# concurrency hangfire

我有一个通过以下方式入队的hangfire作业:

BackgroundJob.Enqueue(() => AnalyzeRequest(request)); 

request对象包含一个userName字符串类型字段。 我想允许对请求进行并行分析,只要它们在userName字段中具有不同的值即可,但是属于同一用户的请求应一个接一个地进行分析。由于我想为不同的用户请求保留并发性,因此我不想使用DisableConcurrentExecution属性。理想情况下,我想做这样的事情:

[DisableConcurrentExecution(request => request.userName)]

有没有内置的方法来实现这一目标?

谢谢

1 个答案:

答案 0 :(得分:1)

我很确定hangfire不能按用户名或参数对它们进行分组,让它们按顺序执行(这是可能的,但看起来很糟糕-您应该在作业内部创建作业,但是这样做可能会失败并附带一个一堆hacky代码)。

我建议您做的是-在AnalyzeRequest()方法中进行管理。 例如,您可以创建用户名及其各自的锁定对象的共享词典。并在执行时在此对象上调用Monitor.TryEnter。如果成功输入-请继续,否则-放弃工作。

是的,它将创建“空”作业发票,但是hangfire可以很好地处理此空呼叫。