[c#] What Makes a Method Thread-safe? What are the rules?