C# - How to Raise and Respond to Events