C# Deadlocks in Depth - Part 1