I learnt about the async/await thing in C# today. It tries to simplify multithreaded programming but there are still all the usual gotchas.
If you're just doing something simple like writing a web server or whatever it probably does help a fair bit.
For complicated stuff I think a message-passing design with minimal synchronization apart from the message queues is going to be easier to reason about and get right.