Trying to do concurrency in C# is an exercise in frustration, especially on mono.
I don't quite understand this statement.
C#, the language, actually has a few useful features for concurrency (lock, async/await.)
The .NET system libraries have some *excellent* features for concurrency, especially with the later "Async" versions of I/O instead of the "Begin" versions. (The Begin versions are still better than Java, but do generate garbage per operation.)
I've found the mono implementation of the system libraries to be shoddy, though, just like the mono implementation of pretty much any other library feature. Perhaps this is what you're referring to?
The WinForms UI framework, by contrast, is not so great for concurrent and threaded operations. Luckily, most servers don't need to worry about this UI problem much.