So I’m running a query and processing the rows that return concurrently using a function called StartJob that will work on my job:
ThreadPool.QueueUserWorkItem(StartJob, job);
Works great and is very fast. But now I’m told that when the query returns, some rows may have the same value for job.UserID and that we can’t be running the StartJob function concurrently for identical values of job.UserID. The question is: how can I have StartJob block execution until any other instances of StartJob with the same UserID have completed?
I’m sure there’s a some way to obtain a per-UserID lock, but I don’t know how to do it. Thanks for the help.
Two versions, one that is good for short
StartJoband works only on .NET 4.0, one that works with .NET >= 3.5.Clearly
hsis in common between all the threads, andidis thejob.UserID.I’ll add that under .NET 4.0 you could use
SpinLockinstead oflock. It is a little faster, but its syntax is a little tricky.