With dot net you really do need to think about how the garbage collector and the cli work to make things efficient, I'm still learning but the language gives you much more power over memory management than Java does. This has the downside of being slightly more involved but can result in faster programs... simple things like taking advantage of the difference between how classes and structs are stored in memory can make a big difference on efficiency, whereas in Java you don't really have control over any of that. I guess its really just a matter of personal preference, because I've found that threading in C# was really easy... and I've actually never used an enum. Whatever
You should be using enums. Threading in C# is a nightmare compared to Java. What you mentioned about C#'s garbage collector is exactly the problem I'm talking about. If I wan't to manage memory I will use C++ or C, programming is a bad place my half measures, and C# is basically built around half measures.
If I want to quickly whip up a cross platform piece of software Java is faster and simpler than C#. If I want to make a complex piece of software that runs FAST C++ is the go, leaving C# in a sort of no mans land. Where its moderately fast, but no-where near C++, where its moderately cross platform, but nowhere near Java, where its moderately easy to program with, but nowhere near Java, where it sort of lets you manage memory, but nowhere near C++.
They tried to mix the power of C++ with the simplicity of Java and only half got there.
Its an in between language. Personally I think the .NET languages that go to extremes are the only good ones, like VB and F#.