I am doing it slightly differently, but maybe it will help you in your case. I start a queue per unique object, using a queuename generator. So every user would probably end up with his own queue. There can be some collisions off course, but not very probable. (37 characters per position, 20 positions), you can choose to prefix with usr_ you still have 16 positions, that's quite a lot of unique users
I start a regular hangfire server for the default queue. In parallel I start a service, get all queues not default, make a queue out of them. Following after that I do something like: While MyQueue.DeQueue; Run a server for a given time, e.g. 2 seconds, dispose the server end while.
When the queue is empty, start all over.