Multithreaded programming is hard, be it with native threads or higher level abstractions like Task Parallel Library (TPL). Locks, Mutex and Semaphore don't seem to make life easier. Shared data across threads is the root of all evil. So why not stop sharing data between threads? Impossible? No! The Actor Model got you covered. With asynchronus messages being sequentially processed by an acotr being the only way to mutate state, all your headaches will go away. With AKKA.NET there is a battle tested implementeation of the Actor Model for C# at your fingertips.