Programming in C#: Managing Multithreating