Constraining Concurrent Threads in C#